Node.js - domain 模块



Node.js domain 模块用于拦截未处理的错误。可以使用内部绑定或外部绑定来截获这些未处理的错误。如果错误根本没有得到处理,那么它们只会使 Node 应用程序崩溃。

  • 内部绑定 - 错误发射器正在 domain 的 run 方法中执行其代码。
  • 外部绑定 - 使用其 add 方法将错误发射器显式添加到 domain 中。

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


var domain = requi re("domain")

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


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

方法

方法 描述
domain.run(function)

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

domain.add(emitter)

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

domain.remove(emitter)

与 domain.add(emitter) 相反。从指定的发射器中删除 domain 处理。

domain.bind(callback)

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

domain.intercept(callback)

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

domain.enter()

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

domain.exit()

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

domain.dispose()

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

属性

属性 描述
domain.members

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

例子

使用以下代码创建名为 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