Node.js进程错误已损坏

您的代码有问题。 至少,这是以下警告似乎指示的内容:

所有测试都通过了,但是此ExperimentalWarning警告使您不满意。 让您感到queueMicrotask()是, queueMicrotask()并未在任何地方直接使用。

警告更难调试,因为它们不是程序控制流的一部分。 相反,Node.js在全局process发出它们。 未捕获的异常和处理不当的诺言也是如此。

忽略这些过程错误不是一种选择,因为它们通常指向错误。 但是,Node.js报告它们的方式对开发人员不友好。

✘️问题1:缺乏背景

如果已打印堆栈跟踪,则上面的问题很容易解决:

这样就很清楚,该警告是由lolex引起的,lolex是单元测试中使用的模拟库。 快速搜索GitHub问题将显示问题的根源。

不幸的是,Node.js不会打印带有警告的堆栈跟踪。

其他流程错误(例如rejectHandled)也缺少上下文。 当兑现承诺的时候为时已晚,这些将被解雇。 但是,错误消息没有显示应归咎于哪行代码:

✘问题2:缺少错误

两次解决或拒绝的承诺通常表示存在错误。

在上面的代码中,promise将使用错误的值来解析,因为它缺少return语句:

Node.js通过multipleResolves流程事件跟踪这些错误。 但是,此事件默认情况下是静默的,这意味着您需要在每个存储库中自行处理该事件。

这似乎并不那么简单。 由于事件处理程序会修改全局状态,因此只能在编写库时在开发中使用它。 它还必须避免自身触发另一个过程错误-否则您的应用程序将因无限递归而崩溃。

✘问题3:错误警报

并非所有过程错误都表明存在错误。

一些multipleResolves事件可能是有意的。 同样,您可以选择忽略一些弃用警告。

✘问题4:远程记录

Node.js使用非结构化格式在控制台上显示进程错误。 将日志重定向到Rollbar或Sentry等仪表板时,这不是理想的选择。

首先,它需要解析控制台输出以将过程错误与常规日志(例如HTTP请求)区分开。

然后,需要解析过程错误消息本身,以便以结构化方式记录其类型( 未捕获的异常还是警告? )和值( 引发了哪个异常? )。

✘问题5:测试

像Ava,Jest或Jasmine这样的测试跑步者可以处理未捕获的异常和承诺。 不幸的是,如果发出过程警告,您的测试仍将通过。

测试警告可能很难,因为它们是在全球范围内发出的,而不是触发它们的测试。

log-process-errors库解决了这些问题。 它将Node.js的行为从:

至:

安装log-process-errors ,可以通过使用node -r CLI标志来使用它:

或通过JavaScript调用:

日志传输可以自定义。 例如,使用Winston:

可以跳过特定的过程错误:

它也可以用于测试。 确保不会触发任何流程错误,方法很简单:

支持大多数JavaScript测试运行程序。

查看GitHub存储库以获取完整的选项列表。