• 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
廣告

© . All rights reserved.