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

domain置模块 将被弃用:

稳定性:0 – 弃用

此模块正在等待弃用。 一旦更换API已经完成,这个模块将被完全弃用。 大多数最终用户不应该有理由使用这个模块。 绝对必须具有域提供的function的用户可能暂时依赖它,但是应该期望在将来不得不迁移到不同的解决scheme。

据此,目前他们并不真正推荐解决scheme。 但是如何实现一个类似于下面的function:

 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); }); 

所以,这处理从asynchronous的东西引发的错误,但domain模块已被弃用。

如何将此代码迁移到更好的东西?


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

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

显然,我不想在这种情况下崩溃的过程,但我想显示一个很好的错误(所以基本捕捉到这个函数中的错误)。

目前在图书馆我做:

 var err = null; try { fn(callback); } catch (e) { err = e; } console.log(err || "Everything went correctly"); 

由于你是真正的问题在这里显然是如何保护你的服务器免受用户提供的代码,你将需要得到用户提供的代码从你的主进程,并在一个沙箱环​​境,不能做坏事情到您的服务器或服务器的文件系统。 我build议你先从vm模块开始,但即使如此,还是有很多关于如何保护你的系统的信息。

您可能还对vm2模块感兴趣,它在vm模块上添加了一些额外的安全function。

一些相关的文章:

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

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

Node.js一个漂亮的JavaScript沙盒

Node.js虚拟机(vm)用法

使用Docker到沙盒不受信任的节点JS代码


如果你只是想在开发人员提供给你的任何代码中发现错误,那么几乎所有你能做的就是围绕你从外部调用的任何东西进行try / catch。

如果第三方代码在asynchronous代码中存在错误,那么这些代码不会冒泡到任何顶层,所以对于这些代码你什么也做不了。 你也不能阻止这个第三方代码泄露资源(如文件句柄,内存等)。

基本上,如果你要在你的程序中运行第三方代码,你需要相信它是好的代码,写得很好,不会泄漏,处理自己的错误,不会去做恶意的事情。 如果你不能相信所有这些东西,那么它应该在一个至less有更多保护措施的沙箱中运行。

从我所了解的是,没有替代domain替代品。 还有两个主要的努力来取代它的function:

  • AsyncWrap跟踪上下文,但不直接暴露给用户空间
  • 通过v8和Chrome开发工具增加可debugging性,请参阅此处

除了使用vm声音适合你的情况。