{/ 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");
答案 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)