Meteor DDP呼叫拦截

Meteor DDP呼叫拦截,meteor,ddp,Meteor,Ddp,我在想,当Meteor客户端或DDP客户端通过DDP连接调用服务器端方法时,我可能希望在Meteor Js项目的服务器上执行横切/AOP或其他功能 这个链接提供了一个关于如何在对象上执行AOP的非常好的示例,但我想知道是否有一种方法可以通过DDP连接侦听入站客户端请求,这与asp.net web api的express interceptor或action filters非常相似,当然也适用于websocket/DDP rpc实现 Meteor Js Api只描述服务器上的一个事件。这个回复提到

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

这个链接提供了一个关于如何在对象上执行AOP的非常好的示例,但我想知道是否有一种方法可以通过DDP连接侦听入站客户端请求,这与asp.net web api的express interceptor或action filters非常相似,当然也适用于websocket/DDP rpc实现

Meteor Js Api只描述服务器上的一个事件。这个回复提到了一个连接。_发送到客户端以执行某些AOP功能…但没有找到除此之外的大量官方文档

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


谢谢。

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

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

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

(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)
  }
})()
客户端->服务器 要在服务器上拦截来自客户端的呼叫,可以执行以下操作:

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.connection._stream.on('message', console.log.bind(console))
上述小口不能与第一个一起使用。做面团并不难。如果您使用这个截取的,Meteor.server.stream\u server.server.\u events.connection将只是一个函数数组,而不是一个函数

客户 服务器->客户端 要在客户端上侦听从服务器到客户端的呼叫,可以执行以下操作:

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.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')
客户端->服务器 正如您所指出的,您还可以对来自客户端的传出消息执行类似的操作


这很好,谢谢你的建议,但是有没有办法在服务器上拦截RPC调用呢?Meteor.connection似乎只在客户端可用。没有任何东西是不需要一点挖掘就可以发现的。我编辑了我的答案。你能把你的问题修改成一个清晰的问题吗?嗯……我只是强调了原始问题的一部分,如果那样能让问题更清晰的话。我会仔细研究你的发现,看看它是否能满足我的需求。再次感谢。据我所知,我可以使用Kriegslustig的建议在服务器上截获连接会话的开始,但之后无法截获呼叫。在Meteor.server对象结构中,我没有发现任何东西可以在实际调用方法之前捕获传输级别DDP层上的单个DDP方法请求:-