Node.js - Módulo de Domínio

Node.js domainmódulo é usado para interceptar erros não tratados. Esses erros não tratados podem ser interceptados usando vinculação interna ou externa. Se os erros não forem tratados, eles simplesmente travarão o aplicativo Node.

  • Internal Binding - O emissor de erros está executando seu código dentro do método run de um domínio.

  • External Binding - O emissor de erros é adicionado explicitamente a um domínio usando seu método add.

Este módulo pode ser importado usando a seguinte sintaxe.

var domain = require("domain")

A classe de domínio do módulo de domínio é usada para fornecer funcionalidade de erros de roteamento e exceções não detectadas para o objeto de Domínio ativo. É uma classe filha de EventEmitter. Para lidar com os erros detectados, ouça o evento de erro. Ele é criado usando a seguinte sintaxe -

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

Métodos

Sr. Não. Método e Descrição
1

domain.run(function)

Execute a função fornecida no contexto do domínio, vinculando implicitamente todos os emissores de eventos, cronômetros e solicitações de baixo nível que são criadas nesse contexto. Esta é a maneira mais básica de usar um domínio.

2

domain.add(emitter)

Adiciona explicitamente um emissor ao domínio. Se algum manipulador de eventos chamado pelo emissor lançar um erro, ou se o emissor emitir um evento de erro, ele será roteado para o evento de erro do domínio, assim como acontece com a vinculação implícita.

3

domain.remove(emitter)

O oposto de domain.add (emissor). Remove o tratamento de domínio do emissor especificado.

4

domain.bind(callback)

A função retornada será um wrapper em torno da função de retorno de chamada fornecida. Quando a função retornada é chamada, quaisquer erros lançados serão roteados para o evento de erro do domínio.

5

domain.intercept(callback)

Este método é quase idêntico ao domain.bind (callback). No entanto, além de detectar erros lançados, ele também interceptará objetos Error enviados como o primeiro argumento para a função.

6

domain.enter()

O método enter é o encanamento usado pelos métodos run, bind e intercept para definir o domínio ativo. Ele define domain.active e process.domain para o domínio e empurra implicitamente o domínio para a pilha de domínio gerenciada pelo módulo de domínio (consulte domain.exit () para obter detalhes sobre a pilha de domínio). A chamada para entrar delimita o início de uma cadeia de chamadas assíncronas e operações de E / S vinculadas a um domínio.

7

domain.exit()

O método de saída sai do domínio atual, retirando-o da pilha do domínio. Sempre que a execução muda para o contexto de uma cadeia diferente de chamadas assíncronas, é importante garantir que o domínio atual seja encerrado. A chamada para sair delimita o fim ou uma interrupção da cadeia de chamadas assíncronas e operações de E / S vinculadas a um domínio.

8

domain.dispose()

Depois que o descarte for chamado, o domínio não será mais usado por retornos de chamada vinculados ao domínio via run, bind ou intercept, e um evento dispose é emitido

Propriedades

S.No. Descrição da Propriedade
1

domain.members

Uma matriz de temporizadores e emissores de eventos que foram explicitamente adicionados ao domínio.

Exemplo

Crie um arquivo js chamado main.js com o seguinte código -

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!'));

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

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