Explicar el concepto de Dominio en Node.js

Introducción: el módulo de dominio de Node.js se utiliza para detectar errores pendientes. Los dominios proporcionan una manera de manejar múltiples operaciones de entrada y salida diferentes como un solo grupo. Si el emisor de eventos o la devolución de llamada están registrados en el dominio y cuando ocurre un evento de error o arroja un error, se notifica al objeto de dominio en lugar de perder el contexto del error. El controlador de errores de dominio no reemplaza el cierre del proceso cuando se produce un error. La forma más segura de lidiar con un error lanzado es cerrarlo. Bajar el proceso. Se recomienda que un servidor web típico envíe una respuesta de error a la solicitud que arrojó el error y lo permita. Otros miembros terminarán a la hora normal y dejarán de escuchar nuevas requests de este trabajador.

El error no controlado se puede interceptar mediante un enlace interno o un enlace externo.

  • Enlace interno: el emisor de errores ejecuta el código dentro del método de ejecución del dominio . Ejecuta una función proporcionada en el contexto del dominio y enlaza implícitamente emisores de eventos, temporizadores y requests de bajo nivel creadas en ese contexto. Opcionalmente, puede pasar argumentos a la función.
  • Enlace externo: el emisor de errores se agrega explícitamente al dominio mediante su método de adición . Agrega explícitamente un emisor al dominio. Si el controlador de eventos llamado por el emisor arroja un error, o si el emisor emite un evento de «error», se reenviará al evento de «error» del dominio, similar al enlace implícito. Esto también funciona con los temporizadores devueltos por setInterval() y setTimeout() . Cuando se invoca la función de devolución de llamada, el controlador de «errores» del dominio la detecta.

Sintaxis: Para usar el módulo de dominio necesitamos importarlo a nuestro directorio de proyectos. La sintaxis será la siguiente: 

const domain = require("domain");

Nota: Según la documentación oficial de Nodejs, este modelo de dominio está pendiente de desaprobación. Una vez que se complete la API de reemplazo, este módulo quedará completamente obsoleto. Los usuarios que absolutamente necesitan tener la funcionalidad proporcionada por el dominio pueden confiar en él por ahora, pero esperan pasar a otra solución en el futuro. Ahora no deberíamos tratar de escribir código nuevo con ellos. 

La clase de dominio del módulo de dominio se utiliza para proporcionar objetos de dominio activos con errores de enrutamiento y excepciones no detectadas. Esta es una subclase de EventEmitter. Para manejar el error que detecta, escuche el evento de error. Se crea con la siguiente sintaxis.

const domain = require("domain");
const createdDomain = domain.create();

Ejemplo 1: este ejemplo demostrará el dominio en Node.js:

Javascript

const EventEmitter = require("events").EventEmitter;
const domain = require("domain");
 
const emitterExplicit = new EventEmitter();
 
// Create a firstDomain for explicit binding
const firstDomain = domain.create();
 
firstDomain.on('error', function(err) {
   console.log("This error will be handled by
       using firstDomain ("+err.message+")");
});
 
// Explicit binding using add method
firstDomain.add(emitterExplicit);
 
emitterExplicit.on('error',function(err) {
   console.log("This error will be handled by
       using listener ("+err.message+")");
});
 
emitterExplicit.emit('error',new Error('listener will handle'));
emitterExplicit.removeAllListeners('error');
emitterExplicit.emit('error',new Error('firstDomain will handle'));
 
// Create secondDomain for implicit binding
const secondDomain = domain.create();
 
secondDomain.on('error', function(err) {
   console.log("This error will be handled by
       using secondDomain ("+err.message+")");
});
 
// Implicit binding using run method
secondDomain.run(function() {
   const emitterImplicit = new EventEmitter();
   emitterImplicit.emit('error',new Error('secondDomain
       will handle'));  
});
 
firstDomain.remove(emitterExplicit);
emitterExplicit.emit('error', new Error('Exception error
    message. The system may crash!'));

Pasos para ejecutar la aplicación: Escriba el siguiente código en la terminal para ejecutar el servidor:

node index.js

Producción:

 

Ejemplo 2: el servidor se crea utilizando el método de enlace explícito. Puede usar un dominio para el servidor HTTP o puede usar un dominio separado para cada solicitud. req y res también se crean en el ámbito de serverUsingDomain. Sin embargo, es una buena idea crear primero un dominio separado para cada solicitud y luego agregarle req y res.

Javascript

const domain = require('domain');
const http = require('http');
const serverUsingDomain = domain.create();
 
serverUsingDomain.run(() => {
  http.createServer((req, res) => {
 
    /* The server is created in the scope of
    serverUsingDomain. Req, and res is also
    created in the scope of serverUsingDomain.
    However, it's a good idea to first create
    a separate domain for each request and
    then add req and res to it. */
    const reqdomain = domain.create();
    reqdomain.add(req);
    reqdomain.add(res);
    reqdomain.on('error', (error) => {
      console.error('Error', error, req.url);
      try {
        res.writeHead(500).end('Some Error occurred.');
      } catch (error2) {
        console.error('Error is sending 500', error2, req.url);
      }
    });
  }).listen(5000, () => {
   console.log("Server is running on PORT 5000");
  });
});

Pasos para ejecutar la aplicación: Escriba el siguiente código en la terminal para ejecutar el servidor:

node index.js

Producción:

 

Método disponible en el módulo de dominio: – Veamos algunos métodos disponibles en el módulo de dominio de Node.js.

  • domain.create(): Devuelve el dominio. La clase Dominio encapsula la funcionalidad de errores de enrutamiento y excepciones no detectadas para objetos de dominio activo.
  • domain.add(emitter): Agrega explícitamente un emitter al dominio. Si el controlador de eventos llamado por el emisor arroja un error, o si el emisor emite un evento de «error», se enviará al evento de «error» del dominio, similar al enlace implícito.
  • domain.run(function): ejecuta una función proporcionada en el contexto del dominio y vincula implícitamente emisores de eventos, temporizadores y requests de bajo nivel creadas en ese contexto. Opcionalmente, puede pasar argumentos a la función.
  • domain.bind(callback):  la función devuelta es un contenedor para la función de devolución de llamada proporcionada. Cuando se llama a la función devuelta, todos los errores generados se propagan al evento de «error» del dominio.
  • domain.intercept(callback): este método es similar al domain.bind (callback). Sin embargo, no solo detecta el error que ocurrió, sino también el objeto Error que se envía como primer argumento de la función.
  • domain.enter(): el método enter() es utilizado por los métodos run(), bind() e intercept() para establecer el dominio activo. Establezca domain.active y process.domain en el dominio e implícitamente inserte el dominio en la pila de dominio administrada por el módulo de dominio (consulte domain.exit() para obtener más información sobre la pila de dominio). Llamar a enter() separa la llamada asíncrona vinculada al dominio del inicio de la string de operaciones de E/S.  
  • domain.exit(): el método exit() sale del dominio actual y lo elimina de la pila de dominios.
  • domain.remove(emitter): Es lo contrario de domain.add(emitter). Elimina el procesamiento del dominio del emisor especificado.

Publicación traducida automáticamente

Artículo escrito por ekantchandrakar07 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *