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); });@H_403_15@因此,这将处理异步事件抛出的错误,但域模块已被弃用.
如何将此代码迁移到更好的东西?
我的用例是,我正在编写一个库,它接受一个函数作为输入,它运行该函数并显示结果(实际上,你可以将它视为单元测试库):
myLib.it("should do something",function (done) { setTimeout(function () { // Some async code // ... // But here an error is thrown throw new Error("dummy"); },1000); });@H_403_15@显然,我不想在这种情况下崩溃的过程,但我确实想要显示一个很好的错误(所以基本上捕捉这个功能的错误).
目前在图书馆我做:
var err = null; try { fn(callback); } catch (e) { err = e; } console.log(err || "Everything went correctly");@H_403_15@
解决方法
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
如果您只是试图捕获由开发人员提供给您的任何代码中的错误,您几乎可以做的就是尝试/捕获来自外部世界的任何内容.
如果第三方代码在异步代码中有错误,那么这些代码就不会冒泡到任何顶层,所以没有什么可以做的.您也不能阻止此第三方代码泄漏资源(如文件句柄,内存等).
基本上,如果你要在你的进程中运行第三方代码,你需要相信它是好的代码,写得好,不泄漏,处理自己的错误,并且不会尝试做恶意的事情.如果你不能相信所有这些东西,那么它应该在一个沙箱中运行,你至少有一些更多的保护.