От автора: модуль Node.js Domain используется для перехвата необработанных ошибок. Необработанные ошибки могут быть перехвачена с использованием внутренней или внешней привязки. Если ошибки не обрабатываются вообще, они просто приводят к сбою приложения Node.
Внутренняя привязка — эмиттер ошибки выполняет код в методе domain домена.
Внешняя привязка — эмиттер ошибки добавляется явно в domain, используя его метод add.
Этот модуль можно импортировать, используя следующий синтаксис.
1 |
var domain = require("domain") |
Класс domain модуля domain используется для обеспечения функционала перенаправления ошибок и неперехваченных исключений в активный объект Domain. Это дочерний класс EventEmitter. Чтобы сделать обработку ошибок, которые он перехватывает, выполняется прослушивание события error. Оно создается с помощью следующего синтаксиса:
1 2 |
var domain = require("domain"); var child = domain.create(); |
Методы
domain.run(function) — Запускает предоставленную функцию в контексте domain, неявно привязав все эмиттеры событий, таймеры и запросы низкого уровня, созданные в этом контексте. Это самый простой способ использования domain.
domain.add(emitter) — Явно добавляет эмиттер в domain. Если любые обработчики событий, вызываемые эмиттером, приводят к ошибке, или, если эмиттер запускает событие error, он будет перенаправлен на событие error из domain, как в случае неявной привязки.
domain.remove(emitter) — Противоположно domain.add(emitter). Удаляет обработку domain из указанного эмиттера.
domain.bind(callback) — Возвращаемая функция будет оболочкой для предоставленной функции обратного вызова. Когда вызывается возвращаемая функция, любые возникшие ошибки будут перенаправлены на событие error из domain.
domain.intercept(callback) — Этот метод почти идентичен domain.bind (callback). Однако, кроме перехвата возникающих ошибок, он также будет перехватывать объекты Error, отправленные в качестве первого аргумента функции.
domain.enter() — Метод enter — это канал, используемый методами run, bind и intercept для установки активного домена. Он устанавливает domain.active и process.domain в домен и неявно добавляет домен в стек доменов, управляемый модулем domain (для получения подробной информации о стеке доменов см. Domain.exit()). Обращение к enter ограничивает начало цепочки асинхронных вызовов и операций ввода-вывода, привязанных к домену.
domain.exit() — Метод exit осуществляет выход из текущего домена, выводя его из стека доменов. Каждый раз, когда выполнение переключается на контекст другой цепи асинхронных вызовов, необходимо обеспечить выход из текущего домена. Обращение к exit ограничивает либо конец, либо прерывание цепочки асинхронных вызовов и операций ввода-вывода, привязанных к домену.
domain.dispose() — После вызова dispose, домен больше не будет использоваться обратными вызовами, привязанными к домену с помощью run, bind или intercept, а также запускается событие dispose.
Свойства
domain.members — Массив таймеров и эмитеров событий, которые были явно добавлены в домен.
Пример
Создайте файл js с именем main.js со следующим кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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:
1 |
$ node main.js |
В результате вы должны получить следующее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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; // Необработанное событие 'error' ^ 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 |
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.