27. 域模块

Node.js domain模块用于拦截未处理的错误。 可以使用内部绑定或外部绑定拦截这些未处理的错误。 如果根本没有处理错误,那么它们只会使Node应用程序崩溃。
  • Internal Binding – 错误发射器正在域的run方法中执行其代码。
  • External Binding – 使用其add方法将错误发射器显式添加到域。

可以使用以下语法导入此模块。var domain = require("domain")。域模块的域类用于为活动域对象提供路由错误和未捕获的异常的功能。 它是EventEmitter的子类。 要处理它捕获的错误,请侦听其错误事件。 它使用以下语法创建:

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

27.1. 方法

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

27.2. 属性

  • domain.members:已明确添加到域中的计时器和事件发射器数组。

27.3. 示例

使用以下代码创建名为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
下一节:Node.js是一个基于Chrome JavaScript运行时的平台,可轻松构建快速,可扩展的网络应用程序。 Node.js使用事件驱动的非阻塞I/O模型,使其轻量级和高效,非常适合在分布式设备上运行的数据密集型实时应用程序。