domain
Все экспорты являются нефункциональными заглушками. Это устаревший модуль Node.
Этот модуль ожидает вывода из эксплуатации. После окончательного утверждения API-замены этот модуль будет полностью выведен из эксплуатации. Большинству разработчиков не потребуется использовать этот модуль. Пользователи, которым крайне необходимы предоставляемые доменами функции, могут пока полагаться на этот модуль, но в будущем им следует ожидать перехода на другое решение.
Домены позволяют обрабатывать несколько различных операций ввода-вывода как одну группу. Если какой-либо из генераторов событий или обратных вызовов, зарегистрированных в домене, генерирует событие 'error' или выбрасывает ошибку, объект домена получит уведомление вместо потери контекста ошибки в обработчике process.on('uncaughtException') или немедленного завершения программы с кодом ошибки.
Использование в Deno
import * as mod from "node:domain";
класс Domain
Использование в Deno
import { Domain } from "node:domain";
Этот символ является нефункциональной заглушкой.
Класс Domain инкапсулирует функциональность перенаправления ошибок и неперехваченных исключений активному объекту Domain.
Чтобы обрабатывать перехваченные ошибки, подпишитесь на событие 'error'.
Свойства
members: Array<EventEmitter | Timer> Массив таймеров и генераторов событий, явно добавленных в домен.
Методы
add(emitter: EventEmitter | Timer): void Явно добавляет генератор событий в домен. Если какой-либо обработчик событий, вызванный генератором, выбрасывает ошибку или если генератор создает событие 'error', оно будет перенаправлено в событие 'error' домена, как и при неявной привязке.
Это также работает с таймерами, возвращаемыми функциями setInterval() и setTimeout(). Если их функция обратного вызова выбрасывает ошибку, она будет перехвачена обработчиком 'error' домена.
Если таймер или EventEmitter уже были привязаны к домену, они удаляются из него и вместо этого привязываются к этому домену.
bind<T extends Function>(callback: T): T Возвращаемая функция будет оберткой для предоставленной функции обратного вызова. При вызове возвращаемой функции любые выброшенные ошибки будут перенаправлены в событие 'error' домена.
const d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.bind((er, data) => {
// If this throws, it will also be passed to the domain.
return cb(er, data ? JSON.parse(data) : null);
}));
}
d.on('error', (er) => {
// An error occurred somewhere. If we throw it now, it will crash the program
// with the normal line number and stack message.
});
enter(): void Метод enter() — это служебный метод, используемый методами run(), bind() и intercept() для установки активного домена. Он устанавливает domain.active и process.domain в значение домена и неявно помещает домен в стек доменов, управляемый модулем доменов (подробности о стеке доменов см. в описании exit). Вызов enter() обозначает начало цепочки асинхронных вызовов и операций ввода-вывода, привязанных к домену.
Вызов enter() изменяет только активный домен, не затрагивая сам домен. Методы enter() и exit() можно вызывать для одного домена произвольное количество раз.
exit(): void Метод exit() завершает работу в текущем домене, извлекая его из стека доменов. Каждый раз, когда выполнение переключается на контекст другой цепочки асинхронных вызовов, важно убедиться, что текущий домен завершен. Вызов exit() обозначает конец цепочки асинхронных вызовов и операций ввода-вывода, привязанных к домену, или прерывание этой цепочки.
Если с текущим контекстом выполнения связано несколько вложенных доменов, exit() завершит работу во всех доменах, вложенных в этот домен.
Вызов exit() изменяет только активный домен, не затрагивая сам домен. Методы enter() и exit() можно вызывать для одного домена произвольное количество раз.
intercept<T extends Function>(callback: T): T Этот метод почти идентичен методу bind. Однако помимо перехвата выброшенных ошибок он также перехватывает объекты Error, переданные функции в качестве первого аргумента.
Таким образом, распространенный шаблон if (err) return callback(err); можно заменить одним обработчиком ошибок в одном месте.
const d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.intercept((data) => {
// Note, the first argument is never passed to the
// callback since it is assumed to be the 'Error' argument
// and thus intercepted by the domain.
// If this throws, it will also be passed to the domain
// so the error-handling logic can be moved to the 'error'
// event on the domain instead of being repeated throughout
// the program.
return cb(null, JSON.parse(data));
}));
}
d.on('error', (er) => {
// An error occurred somewhere. If we throw it now, it will crash the program
// with the normal line number and stack message.
});
remove(emitter: EventEmitter | Timer): void Противоположность методу add. Удаляет обработку доменом для указанного генератора событий.
run<T>(
fn: (...args: any[]) => T,
...args: any[],
): T Запускает предоставленную функцию в контексте домена, неявно привязывая все генераторы событий, таймеры и низкоуровневые запросы, созданные в этом контексте. При необходимости функции можно передать аргументы.
Это самый простой способ использовать домен.
import domain from 'node:domain';
import fs from 'node:fs';
const d = domain.create();
d.on('error', (er) => {
console.error('Caught error!', er);
});
d.run(() => {
process.nextTick(() => {
setTimeout(() => { // Simulating some various async stuff
fs.open('non-existent file', 'r', (er, fd) => {
if (er) throw er;
// proceed...
});
}, 100);
});
});
В этом примере будет вызван обработчик d.on('error'), а не произойдет аварийное завершение программы.
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/domain