我正在考虑以下场景:当 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/