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