Идиоматический способ обработки 404-х в Express состоит в том, чтобы зарегистрировать ваш обработчик маршрута final с помощью метода use
вместо использования одного из методов, специфичных для HTTP.
app.use((req, res) => {
res.render('error', {
title: '404 not found',
errorMessage: '404 not found'
})
})
Я подчеркиваю слово final , потому что use
регистрирует универсальный обработчик, поэтому он переопределит любой маршрут, который ему предшествует в вашем коде.Если все остальные ваши маршруты зарегистрированы до этого, то он будет перехватывать любой запрос, который не соответствует ни одному другому маршруту - независимо от используемого метода HTTP.Так что это будет применяться к любому запросу GET, POST, PUT, DELETE.
Еще более идиотский способ в Express обрабатывать 404 (и все ответы об ошибках HTTP) - использовать аргумент next
, который поставляется со всемиобработчики маршрута.Это перенаправит запрос следующему обработчику, который определенно принимает ошибку в качестве первого аргумента:
app.use((req, res, next) => {
const error = new Error('404 not found')
error.statusCode = 404
next(error)
})
app.use((error, req, res, next) => {
res.status(error.status || 500)
res.render('error', {
title: error.message,
errorMessage: error.message
})
})
Это здорово, потому что теперь у вас есть универсальный обработчик ошибок, к которому вы можете обращаться из любого другогомаршрут.Так что это будет обрабатывать не только 404, но также 401, 403, 503, все, что вы хотите, что не будет успешно отображаться для пользователя.И вы можете получить доступ к этому маршруту, просто вызвав next
с ошибкой в качестве первого аргумента из любого другого обработчика маршрута.