Я использую следующий подход:
Создание asyncWrap
в качестве вспомогательного промежуточного программного обеспечения:
const asyncWrap = fn =>
function asyncUtilWrap (req, res, next, ...args) {
const fnReturn = fn(req, res, next, ...args)
return Promise.resolve(fnReturn).catch(next)
}
module.exports = asyncWrap
Все ваши маршруты / промежуточные программы / контроллеры должны использовать это asyncWrap
для обработки ошибок:
router.get('/', asyncWrap(async (req, res, next) => {
let result = await db.query({x: y})
res.send(result)
}));
На app.js
последнее промежуточное ПО будет получать ошибки всех asyncWrap
:
// 500 Internal Errors
app.use((err, req, res, next) => {
res.status(err.status || 500)
res.send({
message: err.message,
errors: err.errors,
})
})