Cómo comenzar rápidamente con VUE3.0:
el middleware de manejo de errores de Learn Express puede ayudarlo a manejar errores sin repetir el mismo trabajo. Suponiendo que maneja los errores directamente en el controlador de ruta Express:
app.put('/user/:id', async (req, res) => { dejar usuario intentar { usuario = espera User.findOneAndUpdate({ _id: req.params.id }, req.body) } atrapar (errar) { devolver res.status(err.status || 500).json({ mensaje: err.message }) } devolver res.json({usuario}) })
El código anterior funciona bien, sin embargo, ¿qué pasa si hay cientos de interfaces y la lógica de manejo de errores se vuelve imposible de mantener porque se repite cientos de veces?
Express se divide en diferentes tipos según la cantidad de parámetros que toma la función del middleware. La función de middleware que acepta 4 parámetros se define como middleware de manejo de errores y solo se llamará cuando ocurra un error.
aplicación constante = requerir('express')() app.get('*', función routeHandler() { // Este middleware arroja un error y Express irá directamente al siguiente controlador de errores. throw new Error('¡Ups!') }) app.get('*', (req, res, siguiente) => { // Este middleware no es un controlador de errores (solo 3 parámetros), Express lo omitirá porque hay un error en el middleware anterior console.log('Esto no se imprimirá') }) // Su función debe aceptar 4 parámetros para que Express la trate como middleware de manejo de errores. aplicación.use((err, req, res, siguiente) => { res.status(500).json({ mensaje: err.message }) })
Express manejará automáticamente los errores de sincronización, como routeHandler()
anterior. Pero Express no maneja errores asincrónicos. Si se produce un error asincrónico, es necesario llamar next()
.
aplicación constante = requerir('express')() app.get('*', (req, res, siguiente) => { // El método next() le dice a Express que vaya al siguiente middleware de la cadena. // Express no maneja errores asincrónicos, por lo que debe informar los errores llamando a next(). setImmediate(() => { siguiente (nuevo error ('Ups')) }) }) aplicación.use((err, req, res, siguiente) => { res.status(500).json({ mensaje: error.mensaje }) })
Recuerde que el middleware Express se ejecuta de forma secuencial. Debe definir los controladores de errores al final, después de todo el resto del middleware. De lo contrario, no se llamará a su controlador de errores:
async/await
Express con async/await no puede detectar excepciones de promise
, Express se escribió antes de ES6 y no existe una buena solución sobre cómo manejar async/await
que arroja.
Por ejemplo, el siguiente servidor nunca envía correctamente la respuesta HTTP porque el reject
de la promesa nunca se maneja:
const app = require('express')() app.get('*', (req, res, siguiente) => { // El informe de errores asincrónicos debe pasar next() devolver nueva Promesa((resolver, rechazar) => { setImmediate(() => rechazar(nuevo Error('woops'))) }).catch(siguiente) }) app.use((error, req, res, siguiente) => { console.log('no se imprimirá') res.json({ mensaje: error.message }) })Podemos encapsular
app.listen(3000)
o usar una biblioteca existente para capturar.
Primero, simplemente encapsulamos una función para conectar async/await
con el middleware de manejo de errores Express.
NOTA : Las funciones asíncronas devuelven Promise, por lo que debes asegurarte de
catch()
cualquier error y pasarlo anext()
.
función wrapAsync(fn) { función de retorno (req, res, siguiente) { fn(req, res, siguiente).catch(siguiente) } } app.get('*', wrapAsync(async (req, res) => { aguarde nueva promesa (resolver => setTimeout(() => resolver(), 50)) // ¡Error asíncrono! arrojar un nuevo error ('woops') }))
Utilice la biblioteca de terceros express-async-errors
, un sencillo truco de soporte async/await de ES6:
require('express-async-errors') app.get('*', async (req, res, siguiente) => { await new Promise((resolver) => setTimeout(() => resolver(), 50)) arrojar un nuevo error ('woops') })
el middleware de manejo de errores Express le permite manejar errores de una manera que maximiza la separación de preocupaciones. No necesita manejar errores en su lógica de negocios, ni siquiera try/catch
si usa async/await
. Estos errores aparecerán en su controlador de errores, que luego puede decidir cómo responder a la solicitud. ¡Asegúrese de aprovechar esta poderosa función en su próxima aplicación Express!