为什么 make-promises-safe 仅用于 "in top-level program code"

Why is make-promises-safe only for use in "in top-level program code"

make-promises-safe package changes Node.js's default behavior with regards to errors thrown in promises. Normally, in Node, these unhandled promise rejections will be logged, but a program keeps on running. With make-promises-safe installed, Node.js will exit when it encounters an unhandled promise rejection. The "safe" here means that your program won't have secret unhandled rejections, since unhandled rejections often line up with resources that have not been properly cleaned up,这些未清理的资源可能会在较长的 运行 程序中引起问题。

尽我所能。但是,此模块带有警告

It is important that this module is only used in top-level program code, not in reusable modules!

此警告的目的不明确。为什么模块作者建议人们不要在他们自己的可重用模块中使用此模块?

我认为警告确实可以使用一些额外的说明,如果只是为了澄清此处 reusable modulestop-level program code 的稍微混乱的术语的使用。

当我读到警告时,我觉得它警告不要在 packages/modules 中使用它,你发布到 npm。当用户导入您的 npm 包(可能与 error-handling 完全无关)时,您 需要 make-promises-safe 包,这将隐含地强加一个 error-handling 用户可能不知道的机制。当然,您可以将其添加到您的 README 文件中,但并不是每个人都会仔细阅读。

正如您已经在问题的评论部分中讨论的那样,源代码显示它订阅了 unhandledRejection 事件,但即使它可能不像 require make-promises-safe 多次,声明的方式,模块缓存确实应该防止绑定发生不止一次。所以我不认为这是一个问题。另一方面,如果每个模块都开始 requiring make-promises-safe 当然,会有多个订阅事件。

所以,结论。我只需要在您的节点应用程序的入口文件中使用 make-promises-safe(fe.app.js/server.js,您在其中注册 create/configure 您的节点 Web 应用程序的 http 服务器),因此,代码作为开发者,您可以控制自己。我不会在任何节点模块中要求它(无论是在本地还是在 npm 上公开)并将它留给实现您的包的用户如何处理 HIS 应用程序中的错误。