NodeJS 捕获节点中任何EventEmitter的所有“error”事件

thtygnil  于 2023-04-20  发布在  Node.js
关注(0)|答案(1)|浏览(135)

通过the Node.js documentation,未处理的EventEmitter将使正在运行的进程崩溃:
当EventEmitter示例遇到错误时,典型的操作是发出'error'事件。错误事件在node中被视为特殊情况。如果没有侦听器,则默认操作是打印堆栈跟踪并退出程序。
我非常希望进程在发生这种情况时 * 不会 * 崩溃。[1]理想情况下,我可以像这样捕获EventEmitter错误的每个示例:

emitter.on('error', function(err) { console.log(err); })

然而,我们的应用程序很大,对node_modules文件夹的简单搜索会发现有很多EventEmitters,跟踪它们会很麻烦。
是否有一个全局钩子可以用来捕获EventEmitter失败的所有示例?
我尝试了process.on('uncaughtException'),但它不能捕获EventEmitter错误。我还尝试了process.on('error'),它可以捕获进程发出的错误,但不能捕获其他EventEmitter发出的错误。
其他地方说你应该使用域,然而,听起来你需要在其中 Package 特定的函数调用,在这一点上,你还不如用.on('error')找到并 Package 每个EventEmitter。我的同事还说,域如果不被弃用,就不会被使用。
[1]我理解“进程应该崩溃”论点背后的逻辑。部分原因是我想让进程保持活跃,因为a)我们的服务器需要很长时间才能重新启动,b)进程不断崩溃,几乎没有堆栈跟踪;我认为保持进程的活跃将有助于记录和跟踪错误。

oug3syen

oug3syen1#

process.on('uncaughtException', ...)does catch EventEmittor errors.试试这个:

'use strict';

setInterval(function () {}, Number.MAX_VALUE); // keep process alive

var myEmitter = new (require('events').EventEmitter)();

// add this handler before emitting any events
process.on('uncaughtException', function (err) {
    console.log('UNCAUGHT EXCEPTION - keeping process alive:', err); // err.message is "foobar"
});

myEmitter.emit('error', new Error('foobar'));

请注意,如果在错误事件触发后添加uncaughtException侦听器,则异常不会被捕获!

相关问题