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

时间:2015-11-29 19:12:16

标签: javascript node.js asynchronous try-catch

{/ 3}} 将被弃用

  

稳定性: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);
});

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

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

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

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

2 个答案:

答案 0 :(得分:2)

由于您真正面临的问题显然是如何保护您的服务器免受用户提供的代码的影响,因此您需要从主进程和沙盒环境中获取用户提供的代码,这些代码无法执行您的服务器或服务器的文件系统。我建议您从vm module开始,但即便如此,还有很多关于如何保护您的系统的内容。

您可能还对vm2 module感兴趣,Safely sandbox and execute user submitted JavaScript?会在vm模块之上添加一些额外的安全功能。

一些相关文章:

How to run user-submitted scripts securely in a node.js sandbox?

A Nifty Javascript Sandbox for Node.js

Node.js Virtual Machine (vm) Usage

Using Docker to Sandbox Untrusted Node JS Code

{{3}}

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

如果第三方代码在异步代码中有错误,那么这些代码不会冒泡到任何顶层,因此您无法对这些代码做任何事情。您也无法阻止此第三方代码泄漏资源(如文件句柄,内存等...)。

基本上,如果您要在流程中运行第三方代码,您需要相信它的代码很好,编写得很好,不泄漏,处理自己的错误并没有尝试做恶意的事情。如果你不能信任所有这些东西,那么它应该在沙盒中用完,你至少要有一些保护。

答案 1 :(得分:1)

据我所知,domain没有替代品。此外,还有两项主要工作要取代它的功能:

  • AsyncWrap,跟踪上下文,但不直接暴露给用户区
  • 通过v8和Chrome开发工具提高可调试性,请参阅here

除了使用适合您案例的vm声音之外。