收听Node.js中的所有发送的事件
在Node.js中有什么方法来监听EventEmitter对象发出的所有事件?
例如,你可以做一些像…
event_emitter.on('',function(event[, arg1][, arg2]...) {}
这个想法是,我想抓住服务器端EventEmitter
吐出的所有事件, JSON.stringify
事件数据,通过websockets连接发送,在客户端将它们作为一个事件进行改造,然后对事件进行处理在客户端。
如前所述,这个行为不在node.js核心中。 但是你可以使用hij1nx的EventEmitter2:
https://github.com/hij1nx/EventEmitter2
它不会使用EventEmitter破坏任何现有的代码,但增加了对命名空间和通配符的支持。 例如:
server.on('foo.*', function(value1, value2) { console.log(this.event, value1, value2); });
我知道这已经有点老了,但到底是什么,这是你可以采取的另一个解决scheme。
您可以轻松地将发射器的发射function猴子修补到您想要捕捉所有事件:
function patchEmitter(emitter, websocket) { var oldEmit = emitter.emit; emitter.emit = function() { var emitArgs = arguments; // serialize arguments in some way. ... // send them through the websocket received as a parameter ... oldEmit.apply(emitter, arguments); } }
这是非常简单的代码,应该在任何发射器上工作。
_events属性似乎取决于在对象上定义的侦听器,所以它不会做问题的问题。 换句话说,如果定义了一个监听器e.on(“foo”,…),那么即使e从未真正发出“foo”,e._events也会显示“foo”。 另一方面,e可能会发出“bar”,如果没有收听,它将不会出现在e._events中。
对于debugging,特别是具有这样一个“通配符”function,e.on(“*”,…)forms的监听器是很好的,但是这个function似乎不可用。
这是基于马丁在上面提供的答案。 我对节点有点新,所以我需要为自己找出答案。 该方法最后,logAllEmitterEvents是重要的一点。
var events = require('events'); var hungryAnimalEventEmitter = new events.EventEmitter(); function emitHungryAnimalEvents() { hungryAnimalEventEmitter.emit("HungryCat"); hungryAnimalEventEmitter.emit("HungryDog"); hungryAnimalEventEmitter.emit("Fed"); } var meow = function meow() { console.log('meow meow meow'); } hungryAnimalEventEmitter.on('HungryCat', meow); logAllEmitterEvents(hungryAnimalEventEmitter); emitHungryAnimalEvents(); function logAllEmitterEvents(eventEmitter) { var emitToLog = eventEmitter.emit; eventEmitter.emit = function () { var event = arguments[0]; console.log("event emitted: " + event); emitToLog.apply(eventEmitter, arguments); } }
您可能需要查看node.js的RPC模块。 如果我没有弄错Dnode RPC模块有一个类似于你正在做的聊天服务器/客户端的例子 。 所以你可以使用他们的模块或者复制他们正在做的事情。
简而言之,该示例显示了一个服务器,该服务器为连接的客户端创build所有服务器事件的侦听器。 它通过迭代存储的事件名称列表来完成。
var evNames = [ 'joined', 'said', 'parted' ]; con.on('ready', function () { evNames.forEach(function (name) { emitter.on(name, client[name]); }); emitter.emit('joined', client.name); });
这段代码很聪明,因为它在事件发出时自动调用与事件相关的客户端上的远程过程调用。
您也可以使用另一个事件发射器实现,如https://github.com/ozantunca/DispatcherJS 。 执行将如下所示:
dispatcher.on('*', function () {});
DispatcherJS还支持命名空间,甚至依赖关系来确定哪些callback将首先被调用。
这是一个由Martin的答案( https://stackoverflow.com/a/18087021/1264797 )启发的debugging工具。 我现在只是通过将所有事件logging到控制台来找出一组stream中出了什么问题。 很好用。 正如Martin所说的,OP可以通过用websocket发件人replaceconsole.log()调用来使用它。
function debug_emitter(emitter, name) { var orig_emit = emitter.emit; emitter.emit = function() { var emitArgs = arguments; console.log("emitter " + name + " " + util.inspect(emitArgs)); orig_emit.apply(emitter, arguments); } }
有了ES6类,这非常简单:
class Emitter extends require('events') { constructor() { super() } emit(e) { console.log(e + " emitted") super.emit(...arguments) } }