Node.js - Módulo de dominio
Node.js domainEl módulo se utiliza para interceptar errores no controlados. Estos errores no controlados se pueden interceptar mediante un enlace interno o un enlace externo. Si los errores no se manejan en absoluto, simplemente bloquearán la aplicación Node.
Internal Binding - El emisor de errores está ejecutando su código dentro del método de ejecución de un dominio.
External Binding - El emisor de errores se agrega explícitamente a un dominio mediante su método de adición.
Este módulo se puede importar utilizando la siguiente sintaxis.
var domain = require("domain")
La clase de dominio del módulo de dominio se utiliza para proporcionar funcionalidad de errores de enrutamiento y excepciones no detectadas al objeto de dominio activo. Es una clase secundaria de EventEmitter. Para manejar los errores que detecta, escuche su evento de error. Se crea utilizando la siguiente sintaxis:
var domain = require("domain");
var child = domain.create();
Métodos
No Señor. | Método y descripción |
---|---|
1 | domain.run(function) Ejecute la función proporcionada en el contexto del dominio, vinculando implícitamente todos los emisores de eventos, temporizadores y solicitudes de bajo nivel que se crean en ese contexto. Esta es la forma más básica de utilizar un dominio. |
2 | domain.add(emitter) Agrega explícitamente un emisor al dominio. Si algún controlador de eventos llamado por el emisor arroja un error, o si el emisor emite un evento de error, se enrutará al evento de error del dominio, al igual que con el enlace implícito. |
3 | domain.remove(emitter) Lo opuesto a domain.add (emisor). Elimina el manejo de dominio del emisor especificado. |
4 | domain.bind(callback) La función devuelta será un contenedor de la función de devolución de llamada proporcionada. Cuando se llama a la función devuelta, cualquier error que se produzca se enrutará al evento de error del dominio. |
5 | domain.intercept(callback) Este método es casi idéntico a domain.bind (devolución de llamada). Sin embargo, además de detectar errores arrojados, también interceptará los objetos Error enviados como primer argumento de la función. |
6 | domain.enter() El método de entrada es la plomería que utilizan los métodos de ejecución, vinculación e intercepción para establecer el dominio activo. Establece domain.active y process.domain para el dominio, e implícitamente empuja el dominio a la pila de dominios administrada por el módulo de dominio (consulte domain.exit () para obtener detalles sobre la pila de dominios). La llamada a entrar delimita el inicio de una cadena de llamadas asincrónicas y operaciones de E / S ligadas a un dominio. |
7 | domain.exit() El método de salida sale del dominio actual y lo saca de la pila de dominios. Siempre que la ejecución cambie al contexto de una cadena diferente de llamadas asincrónicas, es importante asegurarse de que se sale del dominio actual. La llamada para salir delimita el final o una interrupción de la cadena de llamadas asincrónicas y operaciones de E / S vinculadas a un dominio. |
8 | domain.dispose() Una vez que se ha llamado a dispose, las devoluciones de llamada vinculadas al dominio mediante ejecución, vinculación o intercepción ya no utilizarán el dominio, y se emite un evento de disposición. |
Propiedades
S.No. | Descripción de propiedad |
---|---|
1 | domain.members Una matriz de temporizadores y emisores de eventos que se han agregado explícitamente al dominio. |
Ejemplo
Cree un archivo js llamado main.js con el siguiente 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!'));
Ahora ejecute main.js para ver el resultado:
$ node main.js
Verifique la salida.
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