Estoy empezando a trabajar con Express JS y me he encontrado con un problema. Parece que no puedo descubrir la forma correcta de manejar los errores.¿Cómo manejar adecuadamente los errores en Express?
Por ejemplo, tengo una API de servicios web que sirve un objeto llamado "evento". Me gustaría devolver una cadena simple de "no puedo encontrar el evento" cuando un usuario envía una identificación de evento que no se encuentra. Aquí es cómo estoy actualmente estructurar mi código:
app.get('/event/:id', function(req, res, next) {
if (req.params.id != 1) {
next(new Error('cannot find event ' + req.params.id));
}
req.send('event found!');
});
Cuando envío un id distinto de 1, Nodo bloquea con el siguiente resultado:
http.js:527
throw new Error("Can't set headers after they are sent.");
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
at [object Object].<anonymous> (fs.js:107:5)
at [object Object].emit (events.js:61:17)
at afterRead (fs.js:878:12)
at wrapper (fs.js:245:17)
De lo que puedo decir por el uso de el node.js depurador, la ejecución del bloque de código continúa después de llamar al next()
, lo que significa que req.send('event found!')
intenta ejecutarse. No quiero que esto suceda.
La única solución que he encontrado es simplemente arrojar un new Error()
en lugar de "al lado", pero esto da como resultado que se genere una página de error Express HTML predeterminada. Me gustaría un poco más de control que eso.
Me he tomado el tiempo para leer el error handling section de la documentación de Express, pero no pude darle sentido.
que expresan la documentación en el enlace es bastante pobre sin embargo.Ni siquiera menciona cómo se supone que debes lanzar correctamente un error, o para qué versión de express es válido. – UpTheCreek
Ese es el enlace de Express 3.x, si desea saber más sobre el manejo de errores en 2.x, visite este enlace: http://expressjs.com/2x/guide.html#error-handling – alessioalex
Gracias, eso es útil. – UpTheCreek