我正在考虑我可能想要在Meteor客户端(或DDP)上为我的Meteor Js项目执行横切/ AOP或服务器的其他功能的场景客户端)通过DDP连接调用服务器端方法。
此链接here提供了一个非常好的示例,说明如何在对象上执行AOP,但我想知道是否有一种方法可以通过DDP连接侦听入站客户端请求,就像快速拦截器或动作一样asp.net web api的过滤器,当然,对于websocket / ddp rpc实现。
Meteor Js Api只描述了一个事件" onConnection"在服务器上。这个SO响应提到了客户端上的一个connection._send来执行某些AOP功能......但是除此之外没有找到很多官方文档。
我基本上想知道是否有办法在服务器上监听所有DDP方法调用从所有客户端会话到服务器,如DDP规范中所述here
感谢。
答案 0 :(得分:4)
我们将会发现Meteor中有很多未记载的内容。我真的不认为这是一个问题。以下是拦截Meteor中WebSocket流量的一些方法:
以下是您可以从服务器执行的一些操作:
Server
- >客户端拦截从服务器到客户端的消息有点乏味,但这有效。您可能希望编写一些代码来将log
固定到客户端。
(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)
}
})
上述啜饮不能与第一个一起使用。修复面团并不难。如果您使用此剪辑,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)
}