Вам нужно обрабатывать ошибки по-разному, вот один из способов сделать это:
Создайте промежуточное ПО после всех ваших маршрутов, которое будет перехватывать ошибки, которые вы передаете ему, обратный вызов будет принимать дополнительный параметр содержит подробности об ошибке:
app.use((err, req, res, next) => {
// Handle the error here
});
Всякий раз, когда вы хотите отобразить ошибку, вы можете использовать next
в своих маршрутах, чтобы передать ее этому промежуточному программному обеспечению и передать дополнительную информацию, которую вы можете использовать, чтобы решить, как обработать ошибку. Существует модуль под названием http-errors , который может создавать подобные объекты для вас. Вот пример маршрута:
const createError = require('http-errors');
app.get('/posts', (req, res, next) => {
// Logic...
if(/* some condition */) {
next(createError(404));
}
});
Это передаст созданный объект ошибки в ваше промежуточное ПО для обработки ошибок, и оттуда вы можете выбрать, как его обработать.
Чтобы расширить это, и чтобы улучшить его работу с асинхронным кодом, вы можете обернуть обратные вызовы вашего маршрутизатора функцией, которая будет гарантировать, что исключения, которые вызываются, передаются промежуточному программному обеспечению для обработки ошибок, это удобно при работе с async
и await
:
// Wrapper function to forward errors from async scopes
const wrap = fn => (...args) => fn(...args).catch(args[2]);
app.get('/posts', wrap(async (req, res) => {
// Logic...
await controller.get('posts'); // Promise rejections will get forwarded to middleware
}));
Это также позволяет просто throw
объект ошибки вместо вызова next
.