Node.js 域模块的替代方案是什么?
What is the alternative to Node.js domain module?
domain
built-in module 将被 弃用:
Stability: 0 - Deprecated
This module is pending deprecation. Once a replacement API has been finalized, this module will be fully deprecated. Most end users should not have cause to use this module. Users who absolutely must have the functionality that domains provide may rely on it for the time being but should expect to have to migrate to a different solution in the future.
据此,他们目前并没有真正推荐解决方案。但是如何实现类似于下面的功能:
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");
因为你真正的问题显然是如何保护你的服务器免受用户提供的代码的影响,你需要将用户提供的代码从你的主进程中取出,并在沙盒环境中,不能做坏事您的服务器或服务器的文件系统。我建议您从 vm
module 开始,但即便如此,也有很多关于如何保护您的系统的内容可供阅读。
您可能还对 vm2
module 感兴趣,它在 vm
模块之上增加了一些额外的安全功能。
一些相关文章:
Safely sandbox and execute user submitted JavaScript?
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
如果您只是想捕获开发人员提供给您的任何代码中的错误,您几乎可以做的就是将 try/catch 放在您从外部世界调用的任何代码中。
如果 3rd 方代码在异步代码中有错误,这些错误将不会冒泡到任何顶层,因此您无能为力。您也无法阻止此第 3 方代码泄漏资源(如文件句柄、内存等)。
基本上,如果您要 运行 流程中的第 3 方代码,您需要相信它是好的代码,写得很好,不会泄漏,会处理自己的错误并且不会'尝试做恶意的事情。如果您不能信任所有这些东西,那么它应该 运行 在沙箱中脱离进程,在那里您至少有更多的保护。
据我所知,domain
没有直接替代品。还有两个主要的努力来取代它的功能:
除此之外,使用 vm
听起来适合您的情况。
domain
built-in module 将被 弃用:
Stability: 0 - Deprecated
This module is pending deprecation. Once a replacement API has been finalized, this module will be fully deprecated. Most end users should not have cause to use this module. Users who absolutely must have the functionality that domains provide may rely on it for the time being but should expect to have to migrate to a different solution in the future.
据此,他们目前并没有真正推荐解决方案。但是如何实现类似于下面的功能:
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");
因为你真正的问题显然是如何保护你的服务器免受用户提供的代码的影响,你需要将用户提供的代码从你的主进程中取出,并在沙盒环境中,不能做坏事您的服务器或服务器的文件系统。我建议您从 vm
module 开始,但即便如此,也有很多关于如何保护您的系统的内容可供阅读。
您可能还对 vm2
module 感兴趣,它在 vm
模块之上增加了一些额外的安全功能。
一些相关文章:
Safely sandbox and execute user submitted JavaScript?
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
如果您只是想捕获开发人员提供给您的任何代码中的错误,您几乎可以做的就是将 try/catch 放在您从外部世界调用的任何代码中。
如果 3rd 方代码在异步代码中有错误,这些错误将不会冒泡到任何顶层,因此您无能为力。您也无法阻止此第 3 方代码泄漏资源(如文件句柄、内存等)。
基本上,如果您要 运行 流程中的第 3 方代码,您需要相信它是好的代码,写得很好,不会泄漏,会处理自己的错误并且不会'尝试做恶意的事情。如果您不能信任所有这些东西,那么它应该 运行 在沙箱中脱离进程,在那里您至少有更多的保护。
据我所知,domain
没有直接替代品。还有两个主要的努力来取代它的功能:
除此之外,使用 vm
听起来适合您的情况。