meteor - DDP调用拦截

标签 meteor ddp

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

此链接here给出了一个关于如何在对象上执行 AOP 的非常好的示例,但我想知道是否有一种方法可以通过 DDP 连接监听入站客户端请求,就像 ASP.NET Web api 的 Express-Interceptor 或操作过滤器一样,但是,当然,对于 websocket/ddp rpc 实现。

Meteor Js Api 仅描述服务器上的一个事件“onConnection”。还有这个SO响应提到了一个连接。_在客户端上发送以执行某些 AOP 功能...但没有找到除此之外的大量官方文档。

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

谢谢。

最佳答案

我们会在 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.server.stream_server.server._events.connection 将只是一个函数数组而不是函数。

客户端

服务器->客户端

要在客户端监听从服务器到客户端的调用,您可以执行以下操作:

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')

客户端 -> 服务器

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

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

关于meteor - DDP调用拦截,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427588/

相关文章:

javascript - ValidatedMethod 中的 Meteor this.unblock

css - Meteor 更新后字体损坏

javascript - Meteor 模板数据上下文在模板中不可用。刷新时创建

Meteor 和有序集合(DDP 客户端和观察者)

javascript - Meteor:Facebook 基本 API 调用错误:访问 token

javascript - 向现有 Meteor.js 包添加贡献者?

javascript - Meteor:通过 DDP 登录并在单独的 Meteor 应用程序中检索当前用户对象

javascript - Meteor DDP 发布/订阅

javascript - Ionic 2 + Meteor 如何设置 DDP_DEFAULT_CONNECTION_URL

mongodb - Meteor:集合、变量、发布和订阅的名称之间的区别?