Node.js域模块的替代方案是什么?

Ion*_*zău 12 javascript asynchronous try-catch node.js

domain内置模块 将被弃用:

稳定性:0 - 不推荐使用

此模块正在等待弃用.更新API完成后,将完全弃用此模块.大多数最终用户不应该有使用此模块的原因.绝对必须具有域提供的功能的用户可能暂时依赖它,但是应该期望将来必须迁移到不同的解决方案.

据此,他们目前并不真正推荐解决方案.但是如何实现类似于下面的功能:

var d = require('domain').create();
d.on('error', function(err) {
  console.log(err);
});
d.run(function() {
  setTimeout(function () {
     throw new Error("Something went really wrong in async code.");
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)

因此,这会处理从异步内容中抛出的错误,但domain不推荐使用该模块.

如何将此代码迁移到更好的位置?


我的用例是我正在编写一个接受函数作为输入的库,它运行该函数并显示结果(实际上,您可以将其视为单元测试库):

myLib.it("should do something", function (done) {
   setTimeout(function () {
        // Some async code
        // ...
        // But here an error is thrown
        throw new Error("dummy");
   }, 1000);
});
Run Code Online (Sandbox Code Playgroud)

显然,我不想在这种情况下崩溃进程,但我确实希望显示一个很好的错误(所以基本上捕获此函数中的错误).

目前在图书馆我做:

var err = null;
try {
   fn(callback);
} catch (e) {
   err = e;
}

console.log(err || "Everything went correctly");
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 3

由于您真正的问题显然是如何保护您的服务器免受用户提供的代码的影响,因此您需要将用户提供的代码从您的主进程中取出,并放在一个不能对您的服务器或服务器文件做坏事的沙盒环境中系统。我建议您从vm模块开始,但即使如此,也有很多关于如何保护您的系统的内容需要阅读。

vm2您可能还对该模块感兴趣,该模块在模块顶部添加了一些额外的安全功能vm

一些相关文章:

安全沙箱并执行用户提交的 JavaScript?

如何在node.js沙箱中安全地运行用户提交的脚本?

适用于 Node.js 的漂亮 Javascript 沙箱

Node.js 虚拟机 (vm) 使用情况

使用 Docker 对不受信任的 Node JS 代码进行沙箱处理


如果您只是想捕获开发人员提供给您的任何代码中的错误,那么您几乎所能做的就是将 try/catch 放在您从外部调用的任何内容周围。

如果第 3 方代码在异步代码中存在错误,这些错误不会上升到任何顶层,因此您对此无能为力。您也无法阻止该第三方代码泄漏资源(如文件句柄、内存等)。

基本上,如果您要在进程中运行第 3 方代码,您需要相信它是好的代码,编写得很好,不会泄漏,能够处理自己的错误并且不会尝试做恶意的事情。如果您不能信任所有这些事情,那么它应该在沙箱中的进程外运行,在那里您至少有更多的保护。