首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDP呼叫截获

DDP呼叫截获
EN

Stack Overflow用户
提问于 2015-09-06 19:44:22
回答 1查看 917关注 0票数 2

当Meteor客户端(或DDP客户端)通过DDP连接调用服务器端方法时,我想要在Meteor项目的服务器上执行横切/AOP或其他函数的场景。

这个链接这里给出了一个关于如何在对象上执行AOP的很好的例子,但是我想知道是否有一种方法可以监听DDP连接上的入站客户端请求,就像asp.net web的快递拦截器或动作过滤器一样,但是当然,对于websocket/ddp实现也是如此。

Meteor只描述服务器上的一个事件"onConnection“。而且这个所以响应提到了客户机上执行某些AOP的connection._send,除此之外,functions...but没有找到大量的官方文档。

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-09-06 21:56:09

我们会在“流星”里找到很多没有记载的东西。我并不认为这是个问题。下面是在Meteor中拦截WebSocket流量的一些方法:

服务器

以下是您可以从服务器上做的一些事情:

Server ->客户端

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

代码语言:javascript
复制
(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)
  }
})()

Client -> Server

要拦截来自服务器上的客户端的调用,您可以这样做:

代码语言:javascript
复制
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将只是一个函数数组,而不是一个函数。

客户端

服务器-> Client

要在客户端上侦听服务器对客户端的调用,可以这样做:

代码语言:javascript
复制
Meteor.connection._stream.on('message', console.log.bind(console))

你也可以用这样的方法拦截他们

代码语言:javascript
复制
(function () {
  var cb = Meteor.connection._stream.eventCallbacks.message[0]
  Meteor.connection._stream.eventCallbacks.message[0] = function () {
    console.log(arguments)
    cb.apply(this, arguments)
  }
})()

不完全确定那个有多牢固。但这很管用,那又怎样呢。

要测试它,您可以简单地做

代码语言:javascript
复制
Meteor.subscribe('test')

Client ->服务器

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

代码语言:javascript
复制
Meteor.connection._send = function () {
  console.log(arguments)
  this.__proto__._send.apply(this, arguments)
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32427588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档