javascript – Node.js域模块的替代方法是什么?

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

因此,这将处理异步事件抛出的错误,但域模块已被弃用.

如何将此代码迁移到更好的东西?

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

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

如果您只是试图捕获由开发人员提供给您的任何代码中的错误,您几乎可以做的就是尝试/捕获来自外部世界的任何内容.

如果第三方代码在异步代码中有错误,那么这些代码就不会冒泡到任何顶层,所以没有什么可以做的.您也不能阻止此第三方代码泄漏资源(如文件句柄,内存等).

基本上,如果你要在你的进程中运行第三方代码,你需要相信它是好的代码,写得好,不泄漏,处理自己的错误,并且不会尝试做恶意的事情.如果你不能相信所有这些东西,那么它应该在一个沙箱中运行,你至少有一些更多的保护.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...