Javascript Node.js域模块的替代方案是什么?
将不推荐使用以下选项: 稳定性:0-不推荐使用 此模块正在等待弃用。一旦完成替换API,此模块将被完全弃用。大多数最终用户不应该有理由使用此模块。绝对必须拥有域提供的功能的用户可能暂时依赖它,但应该期望将来必须迁移到不同的解决方案 根据这一点,他们目前并不真正推荐解决方案。但如何实现类似于以下功能的功能:Javascript Node.js域模块的替代方案是什么?,javascript,node.js,asynchronous,try-catch,Javascript,Node.js,Asynchronous,Try Catch,将不推荐使用以下选项: 稳定性:0-不推荐使用 此模块正在等待弃用。一旦完成替换API,此模块将被完全弃用。大多数最终用户不应该有理由使用此模块。绝对必须拥有域提供的功能的用户可能暂时依赖它,但应该期望将来必须迁移到不同的解决方案 根据这一点,他们目前并不真正推荐解决方案。但如何实现类似于以下功能的功能: var d = require('domain').create(); d.on('error', function(err) { console.log(err); }); d.run(
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);
});
因此,这可以处理异步内容引发的错误,但是域
模块已被弃用
如何将此代码迁移到更好的地方
我的用例是,我正在编写一个库,它接受一个函数作为输入,并运行该函数并显示结果(实际上,您可以将其视为单元测试库): 显然,我不想在这种情况下使进程崩溃,但我确实想显示一个很好的错误(因此基本上在这个函数中捕获错误) 目前在库中,我做:
var err = null;
try {
fn(callback);
} catch (e) {
err = e;
}
console.log(err || "Everything went correctly");
因为这里真正的问题显然是如何保护您的服务器不受用户提供的代码的影响,所以您需要将用户提供的代码从主进程中取出,并放在一个沙盒环境中,该环境不能对您的服务器或服务器的文件系统造成不良影响。我建议您从开始,但即使如此,关于如何保护您的系统,还有很多值得阅读的内容 您可能还对在
vm
模块上添加一些附加安全功能的感兴趣
一些相关文章:
如果您只是试图捕获开发人员提供给您的任何代码中的错误,那么您所能做的就是将try/catch放在您从外部世界调用的任何代码中 如果第三方代码在异步代码中有错误,这些错误将不会冒泡到任何顶层,因此您对此无能为力。您也无法防止此第三方代码泄漏资源(如文件句柄、内存等)
基本上,如果您要在流程中运行第三方代码,您需要相信它是好代码,编写良好,不会泄漏,能够处理自己的错误,并且不会尝试进行恶意操作。如果你不能信任所有这些东西,那么它应该在一个沙箱中运行,在沙箱中你至少还有一些保护。据我所知,
域
没有替代品。此外,还有两项主要工作要取代it的功能:
- ,它跟踪上下文,但不直接向userland公开
- 通过
和Chrome开发工具提高可调试性,请参阅v8
除此之外,使用
vm
听起来很适合您的情况。全局错误处理程序在node.js中除了关闭服务器外,其他任何功能都不起作用,因为它们无法确切知道出错的上下文以及如何恢复。现在更好的方案是对所有异步代码使用承诺,然后至少在承诺的顶层捕获错误,在那里您可以实际处理错误。Promission将自动捕获异常并将其转换为promise错误处理程序。@jfriend00在我的情况下,我无法控制它,因为这是用户提供的函数,我真的不想在发生错误时中断进程。也许vm
模块是一个解决方案?用户提供的代码可能会对服务器造成可怕的影响,除非您在单独的沙盒进程中运行它,否则您无法保护自己。vm
模块可能会被证明是有用的,但即使这样,您也必须小心。@jfriend00在我的例子中,开发人员以函数的形式提供代码,我正在编写的库应该处理函数中的任何错误。在开发人员提供的代码中,您无法捕获异步操作中的错误。它们只是没有泡到顶层。你可以把try/catch放在任何你称之为他们的东西上,这就是你所能做的。除此之外,由开发人员提供的代码在处理自己的错误方面是否明智也是一个问题。这里并不是真正的服务器案例,但知道这一点很好。在我的例子中,我正在为Node.js编写一个单元测试库。你能添加一个例子吗?@IonicăBizău-有很多文章都有例子和教程。请参阅我在答案中添加的链接。而且,如果你想得到更好的帮助,你可以编辑你的问题,以更详细地定义你实际上要解决的问题。现在,你的问题问的是你尝试过的一个解决方案,实际上并没有描述你试图解决的总体问题。当然,我改进了我的问题。我正在检查链接。我已经在谷歌上搜索了很多,但最后还是问了这个问题D@IonicăBizău-我在回答的末尾添加了更多内容。如果第三方代码在异步代码中存在错误,这些错误将不会上升到任何最高级别,因此您对此无能为力domain
模块可以做到这一点,我今天想找到一个很好的方法来做到这一点,因为我想向用户展示友好的错误。除此之外,使用vm听起来更适合您的情况在上下文中运行代码时,是否有方法捕获错误(例如,类似于runCode(“foo”)。on(“error”)
?谢谢
var err = null;
try {
fn(callback);
} catch (e) {
err = e;
}
console.log(err || "Everything went correctly");