¿Cómo manejar los errores en node.js?

Node.js es una extensión de JavaScript utilizada para secuencias de comandos del lado del servidor. El manejo de errores es un paso obligatorio en el desarrollo de aplicaciones. Un desarrollador de Node.js puede trabajar con funciones síncronas y asíncronas simultáneamente. El manejo de errores en funciones asíncronas es importante porque su comportamiento puede variar, a diferencia de las funciones síncronas. Mientras que los bloques try-catch son efectivos para las funciones síncronas, las funciones asíncronas se pueden tratar con devoluciones de llamada, promesas y espera asíncrona. Try-catch es síncrono significa que si una función asíncrona arroja un error en un bloque try/catch síncrono, no arroja ningún error. Los errores generados en las aplicaciones de Node.js se pueden manejar de las siguientes maneras:

  1. Usando el bloque try-catch
  2. Uso de devoluciones de llamada
  3. Uso de promesas y devoluciones de llamada de promesa
  4. Usando asíncrono-espera

Uso del bloque try-catch: el bloque try-catch se puede usar para manejar errores generados por un bloque de código.

function dosomething(){
    throw new Error(
    'a error is thrown from dosomething');
}
  
function init(){
    try{
        dosomething();
    }
    catch(e){
        console.log(e);
    }
 console.log(
    "After successful error handling");
}
  
init();

Producción:

Error: a error is thrown from dosomething
    at dosomething (/home/cg/root/6422736/main.js:4:11)
    at init (/home/cg/root/6422736/main.js:9:9)
    at Object. (/home/cg/root/6422736/main.js:17:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
After successful error handling

Explicación: se llama a la función init(), que a su vez llama a la función dosomething(), que arroja un objeto de error. Este objeto de error es capturado por el bloque catch del método init(). Si no hay un manejo adecuado del error, el programa terminará. El bloque catch imprime la pila de llamadas para mostrar el punto donde ocurrió el error.

Uso de devoluciones de llamada: una devolución de llamada es una función llamada al finalizar una tarea determinada. Las devoluciones de llamada se usan ampliamente en Node.js, ya que evitan cualquier bloqueo y permiten que se ejecute otro código mientras tanto. El programa no espera a que se complete la lectura del archivo y procede a imprimir «Programa finalizado» mientras continúa leyendo el archivo. Si ocurre algún error como que el archivo no existe en el sistema, el error se imprime después de «Programa finalizado», de lo contrario, se muestra el contenido del archivo.

var fs = require("fs");
  
fs.readFile('foo.txt', function (err, data) {
   if (err) {
       console.error(err);
}else{
   console.log(data.toString());
}
});
  
console.log("Program Ended");

Producción:

Program Ended
[Error: ENOENT: no such file or directory, 
  open 'C:\Users\User\Desktop\foo.txt'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\User\\Desktop\\foo.txt'
}

Explicación: en este caso, el archivo no existe en el sistema, por lo que se genera el error.

Uso de promesas y devoluciones de llamada de promesa: las promesas son una mejora de las devoluciones de llamada de Node.js. Al definir la devolución de llamada, el valor que se devuelve se denomina «promesa». La diferencia clave entre una promesa y una devolución de llamada es el valor de retorno. No existe el concepto de un valor de retorno en las devoluciones de llamada. El valor devuelto proporciona más control para definir la función de devolución de llamada. Para usar promesas, el módulo de promesa debe estar instalado e importado en la aplicación. La cláusula .then maneja la salida de la promesa. Si ocurre un error en cualquier cláusula .then o si alguna de las promesas anteriores se rechaza, se pasa a la cláusula .catch inmediata. En caso de que se rechace una promesa y no haya un controlador de errores, el programa finaliza.

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/TestDB';
  
MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Test').updateOne({
            "Name": "Joe"
        }, {
            $set: {
                "Name": "Beck"
            }
        });
    });
   .catch(error => alert(error.message)) 

Producción:

// In this case we assume the url is wrong
MongoError: failed to connect to server [localhost:27017]
// error message may vary

Uso de async-await: Async-await es una sintaxis especial para trabajar con promesas de una manera más simple y fácil de entender. Cuando usamos async/await, .then se reemplaza por await, que maneja la espera en la función. El manejo de errores se realiza mediante la cláusula .catch. Async-await también se puede envolver en un bloque try-catch para el manejo de errores. En caso de que no exista un controlador de errores, el programa finaliza debido a un error no detectado.

async function f() {
  let response = await fetch('http://xyzurl');
}
  
// f() becomes a rejected promise
f().catch(alert);

Producción:

// the url is wrong //
TypeError: failed to fetch 

Publicación traducida automáticamente

Artículo escrito por Shreyasi_Chakraborty 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 *