• Node.js Video Tutorials

Node.js - 域模块



Node.js 的domain 模块用于拦截未处理的错误。这些未处理的错误可以通过内部绑定或外部绑定来拦截。如果错误根本没有被处理,则它们将简单地使 Node 应用程序崩溃。

  • 内部绑定 - 错误发射器在其代码中运行 domain 的 run 方法。

  • 外部绑定 - 错误发射器使用其 add 方法显式地添加到域中。

可以使用以下语法导入此模块。

var domain = require("domain")

domain 模块的 domain 类用于提供将错误和未捕获异常路由到活动 Domain 对象的功能。它是 EventEmitter 的子类。要处理它捕获的错误,请侦听其 error 事件。它使用以下语法创建:

var domain = require("domain");
var child = domain.create();

方法

序号 方法及描述
1

domain.run(function)

在域的上下文中运行提供的函数,隐式地绑定在此上下文中创建的所有事件发射器、计时器和低级请求。这是使用域的最基本方法。

2

domain.add(emitter)

显式地将发射器添加到域中。如果发射器调用的任何事件处理程序抛出错误,或者如果发射器发出 error 事件,它将被路由到域的 error 事件,就像隐式绑定一样。

3

domain.remove(emitter)

domain.add(emitter) 的反向操作。从指定的发射器中删除域处理。

4

domain.bind(callback)

返回的函数将是提供的回调函数的包装器。当调用返回的函数时,抛出的任何错误都将被路由到域的 error 事件。

5

domain.intercept(callback)

此方法几乎与 domain.bind(callback) 相同。但是,除了捕获抛出的错误外,它还将拦截作为函数的第一个参数发送的 Error 对象。

6

domain.enter()

enter 方法是 run、bind 和 intercept 方法使用的管道,用于设置活动域。它将 domain.active 和 process.domain 设置为域,并隐式地将域推送到由 domain 模块管理的域堆栈(有关域堆栈的详细信息,请参阅 domain.exit())。对 enter 的调用限定了绑定到域的一系列异步调用和 I/O 操作的开始。

7

domain.exit()

exit 方法退出当前域,将其从域堆栈中弹出。每当执行切换到不同异步调用链的上下文中时,务必确保退出当前域。对 exit 的调用限定了绑定到域的一系列异步调用和 I/O 操作的结束或中断。

8

domain.dispose()

一旦调用 dispose,域将不再由通过 run、bind 或 intercept 绑定到域的回调使用,并且会发出 dispose 事件

属性

序号 属性及描述
1

domain.members

已显式添加到域的计时器和事件发射器的数组。

示例

创建一个名为 main.js 的 js 文件,其中包含以下代码:

var EventEmitter = require("events").EventEmitter;
var domain = require("domain");

var emitter1 = new EventEmitter();

// Create a domain
var domain1 = domain.create();

domain1.on('error', function(err) {
   console.log("domain1 handled this error ("+err.message+")");
});

// Explicit binding 
domain1.add(emitter1);

emitter1.on('error',function(err) {
   console.log("listener handled this error ("+err.message+")");
});

emitter1.emit('error',new Error('To be handled by listener'));
emitter1.removeAllListeners('error');
emitter1.emit('error',new Error('To be handled by domain1'));

var domain2 = domain.create();

domain2.on('error', function(err) {
   console.log("domain2 handled this error ("+err.message+")");
});

// Implicit binding
domain2.run(function() {
   var emitter2 = new EventEmitter();
   emitter2.emit('error',new Error('To be handled by domain2'));   
});

domain1.remove(emitter1);
emitter1.emit('error', new Error('Converted to exception. System will crash!'));

现在运行 main.js 以查看结果:

$ node main.js

验证输出。

listener handled this error (To be handled by listener)
domain1 handled this error (To be handled by domain1)
domain2 handled this error (To be handled by domain2)

events.js:72 throw er; // Unhandled 'error' event
         ^
Error: Converted to exception. System will crash!
   at Object. (/web/com/1427722220_30772/main.js:40:24)
   at Module._compile (module.js:456:26)
   at Object.Module._extensions..js (module.js:474:10)
   at Module.load (module.js:356:32)
   at Function.Module._load (module.js:312:12)
   at Function.Module.runMain (module.js:497:10)
   at startup (node.js:119:16)
   at node.js:906:3
nodejs_utitlity_module.htm
广告