首页 文章

DDP呼叫拦截

提问于
浏览
2

我正在考虑我可能希望通过DDP连接为我的Meteor Js项目 when a Meteor client (or DDP client) invokes a server-side method 执行横切/ AOP或其他功能的场景 .

这个链接here提供了一个如何在对象上执行AOP的非常好的示例,但我想知道是否有办法通过DDP连接侦听入站客户端请求,就像表达拦截器或asp.net web api的动作过滤器一样但是,当然,对于websocket / ddp rpc实现 .

Meteor Js Api在服务器上只描述了一个事件“onConnection” . 而这个SO响应提到客户端上的connection._send执行某些AOP功能......但除此之外没有找到大量的官方文档 .

我基本上想知道是否有一种方法可以在服务器上监听从所有客户端会话到服务器的所有DDP方法调用,如DDP规范here所述

谢谢 .

1 回答

  • 4

    我们将会发现Meteor中有很多未记载的内容 . 我真的不认为这是一个问题 . 以下是拦截Meteor中WebSocket流量的一些方法:

    服务器

    以下是您可以从服务器执行的一些操作:

    服务器 - >客户端

    它's a bit tedious to intercept messages from the server to the client, but this works. You' d可能想写一些代码来将 log s写入客户端 .

    (function () {
      var timeout = 3000
      var streamServer = Meteor.server.stream_server
      var standardConnect = streamServer.server._events.connection
    
      streamServer.server._events.connection = function (socket) {
        var write = socket.write
        socket.write = function () {
          console.log(arguments)
          write.apply(this, args)
        }
        standardConnect.apply(this, arguments)
      }
    })()
    

    客户端 - >服务器

    要拦截来自客户端 on the server 的调用,您可以执行以下操作:

    Meteor.server.stream_server.server.addListener('connection', function (socket) {
      var old = socket._events.data
      socket._events.data = function () {
        console.log(arguments)
        old.apply(this, arguments)
      }
    })
    

    上面的啜饮可以很难修复面团 . 如果使用此剪辑, Meteor.server.stream_server.server._events.connection 将只是一个函数数组而不是函数 .

    客户

    服务器 - >客户端

    要收听从服务器到客户端的呼叫 on the client ,您可以这样做:

    Meteor.connection._stream.on('message', console.log.bind(console))
    

    您也可以使用类似的东西拦截它们

    (function () {
      var cb = Meteor.connection._stream.eventCallbacks.message[0]
      Meteor.connection._stream.eventCallbacks.message[0] = function () {
        console.log(arguments)
        cb.apply(this, arguments)
      }
    })()
    

    不完全确定那是多么坚固 . 但是它有效,所以到底是什么 .

    要测试它,你可以做到

    Meteor.subscribe('test')
    

    客户端 - >服务器

    正如您所指出的,您也可以使用外发邮件 from the client 执行类似的操作 .

    Meteor.connection._send = function () {
      console.log(arguments)
      this.__proto__._send.apply(this, arguments)
    }
    

相关问题