4

当事件处理程序注册时,有什么方法可以记录所有其他已注册的事件处理程序?

还有有没有办法记录所有发出的事件,以及在运行时发出事件时触发的处理程序函数的名称?

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

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

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

4

1 回答 1

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'));
于 2012-10-02T06:14:30.740 回答