Node.js domain 模块

  • domain 模块

    Node.js domain 模块用于拦截未处理的错误。这些未处理的错误可以使用内部绑定或外部绑定来拦截。如果根本不处理错误,那么它们只会使Node应用程序崩溃。
    • 内部绑定 -错误发射器正在域的run方法内执行其代码。
    • 外部绑定 -错误发射器使用其添加方法显式添加到域。
    可以使用以下语法导入该模块。
    
    var domain = require("domain")
    
    domain 模块的 domain 类用于向活动域对象提供路由错误和未捕获的异常的功能。它是EventEmitter的子类。要处理它捕获的错误,请侦听其错误事件。它使用以下语法创建-
    
    var domain = require("domain");
    var child = domain.create();
    
  • 方法

    方法 说明
    domain.run(function) 在域的上下文中运行提供的功能,隐式绑定在该上下文中创建的所有事件发射器,计时器和lowe evel请求。这是使用域的最基本方法。
    domain.add(emitter) 明确将发射器添加到域中。如果由发射器调用的任何事件处理程序引发错误,或者如果发射器发出错误事件,则将其路由到域的错误事件,就像隐式绑定一样。
    domain.remove(emitter) 与domain.add(emitter)相反。从指定的发射器删除域处理
    domain.bind(callback) 返回的函数将是提供的回调函数的包装。调用返回的函数时,引发的任何错误都将路由到域的错误事件。
    domain.intercept(callback) 此方法几乎与domain.bind [回调函数]相同。但是,除了捕获引发的错误外,它还将拦截作为第一个参数发送给函数的Error对象。
    domain.enter() enter方法是运行,绑定和拦截方法用来设置活动域的管道。它将domain.active和process.domain设置为该域,并将该域隐式推送到由域模块管理的域堆栈上(有关域堆栈的详细信息,请参阅domain.exit())。输入调用界定了绑定到域domain的一系列异步调用和I / O操作的开始。exit()exit方法退出当前域,将其从域堆栈中弹出。每当执行切换到不同的异步调用链的上下文时,确保退出当前域就很重要。出口的调用界定了绑定到域的异步调用和I / O操作链的结束或中断。
    domain.dispose() 一旦调用dispose,该域将不再被通过运行,绑定或拦截绑定到该域的回调使用,并且将发出一个dispose事件。
  • 属性

    以下是domain.resolve()方法使用的有效rrtype列表-
    属性 说明
    domain.members 已明确添加到域中的计时器和事件发射器的数组。
  • 示例

    使用以下代码创建一个名为main.js的js文件-
    
    var EventEmitter = require("events").EventEmitter;
    var domain = require("domain");
    
    var emitter1 = new EventEmitter();
    
    // 新建域
    var domain1 = domain.create();
    
    domain1.on('error', function(err) {
       console.log("domain1处理了此错误 ("+err.message+")");
    });
    
    //显式绑定
    domain1.add(emitter1);
    
    emitter1.on('error',function(err) {
       console.log("侦听器处理了此错误 ("+err.message+")");
    });
    
    emitter1.emit('error',new Error('由侦听器处理'));
    emitter1.removeAllListeners('error');
    emitter1.emit('error',new Error('由domain1处理'));
    
    // 新建domain2
    var domain2 = domain.create();
    
    domain2.on('error', function(err) {
       console.log("domain2处理了此错误 ("+err.message+")");
    });
    
    // Implicit binding
    domain2.run(function() {
       var emitter2 = new EventEmitter();
       emitter2.emit('error',new Error('由domain2处理'));   
    });
    
    domain1.remove(emitter1);
    emitter1.emit('error', new Error('转换为异常。 系统会崩溃!'));
    
    尝试一下
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    侦听器处理了此错误 (由侦听器处理)
    domain1处理了此错误 (由domain1处理)
    domain2处理了此错误 (由domain2处理)
    events.js:291
    throw er; // Unhandled 'error' event
    ^
    
    Error: 转换为异常。 系统会崩溃!
    at Object. (/var/www/nodejs/Tmp5f2218b75e6411596070071.js:38:24)
    at Module._compile (internal/modules/cjs/loader.js:1201:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1221:10)
    at Module.load (internal/modules/cjs/loader.js:1050:32)
    at Function.Module._load (internal/modules/cjs/loader.js:938:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
    Emitted 'error' event at:
    at Object. (/var/www/nodejs/Tmp5f2218b75e6411596070071.js:38:10)
    at Module._compile (internal/modules/cjs/loader.js:1201:30)
    [... lines matching original stack trace ...]
    at internal/main/run_main_module.js:17:47