2

我正在考虑当 Meteor 客户端(或 DDP 客户端)通过 DDP 连接调用服务器端方法时,我可能希望在服务器上为 Meteor Js 项目执行横切/AOP 或其他功能的场景。

此处的此链接提供了一个非常好的示例,说明如何对对象执行 AOP,但我想知道是否有一种方法可以通过 DDP 连接侦听入站客户端请求,就像 asp.net web api 的 express-interceptor 或操作过滤器一样但是,当然,对于 websocket/ddp rpc 实现。

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

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

谢谢。

4

1 回答 1

4

我们会在 Meteor 中找到很多未记录的内容。我真的不认为这是一个问题。下面是一些在 Meteor 中拦截 WebSocket 流量的方法:

服务器

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

Server-> 客户

截取从服务器到客户端的消息有点繁琐,但这是可行的。您可能想要编写一些代码来将logs 固定到客户端。

(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)
  }
})()

客户->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)
  }
})

上面的啜饮不能与第一个一起使用。修面团并不难。如果你使用这个snipped,Meteor.server.stream_server.server._events.connection将只是一个函数数组而不是一个函数。

客户

服务器->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')

Client-> 服务器

正如您所指出的,您还可以对来自客户端的传出消息执行类似的操作。

Meteor.connection._send = function () {
  console.log(arguments)
  this.__proto__._send.apply(this, arguments)
}
于 2015-09-06T21:56:09.040 回答