2012-09-29 45 views
4

当事件处理程序获得注册时,有没有办法记录所有其他注册的事件处理程序?如何记录和跟踪NodeJS事件和事件处理程序的调用?

还有什么办法可以记录所有发出的事件,以及在运行时发生事件时触发的处理函数的名称吗?

如果nodejs应用程序触发链式事件(一个事件触发另一个事件)并且每个事件都有多个处理程序,那么当事件处理程序链的叶发生异常时,stacktrace不会显示上下文的完整信息。

事件日志和处理程序信息在这种情况下非常有用。

一个hackey解决方案是添加(条件)日志记录到https://github.com/joyent/node/blob/master/lib/events.js,但我确定必须有更好的方法。

回答

3

https://github.com/joyent/node/blob/master/lib/events.js#L142-147

它能发出newListener事件的名称和功能。

接下来,而不是改变events.js,打出原型。一旦你需要EventEmitter,你可以在运行时修改它。这通常是不好的做法,特别是对于像EventEmitter这样重要的事情,但它对调试自己的程序很好。

(function(){ 
    var old = EventEmitter.prototype.emit; 
    EventEmitter.prototype.emit = ... 
)(); 

接下来,登录其他处理程序:

console.log(emitter.listeners('eventName')); 
+0

嗯,好主意:) –

+1

https://gist.github.com/bnoordhuis/1555127 – user625488