#node.js #express #error-handling #server #middleware
#node.js #экспресс #обработка ошибок #сервер #промежуточное программное обеспечение
Вопрос:
давайте возьмем этот фрагмент для примера
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.get(...)
# all my routes #
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
app.listen(9000)
....
выдает ли body-parser ошибку?
Возможно, клиент закрывает соединение или полезная нагрузка запроса слишком велика
клиент получит сообщение об ошибке с кодом состояния 500 от обработчика ошибок express по умолчанию, но, вероятно, это ошибка, которая должна возвращать ответ 4xx .
Я подумал о том, чтобы поместить промежуточное программное обеспечение сразу после него и вызвать res.send с кодом ошибки и состояния 400.
возможно, оберните все мои сторонние промежуточные программы обработчиком try-catch
Или добавляя в мое промежуточное программное обеспечение для обработки ошибок огромный случай переключения и со временем добавляя ошибку, вызванную сторонним промежуточным программным обеспечением, и измените там код состояния на 400
Все решения на самом деле не являются надежными и требуют обслуживания с течением времени
Какие у нас есть рекомендации по наилучшей практике?
Ответ №1:
Модуль синтаксического анализа тела должен вызываться next(err)
при обнаружении ошибки, и затем вы можете перехватить ее, предоставив экспресс-обработчик ошибок, такой как:
app.use(function(err, req, res, next) {
console.error(err.stack)
res.status(500).send('Put your content here')
});
Когда вы определяете это специальное промежуточное программное обеспечение (с четырьмя аргументами), Express будет отслеживать это отдельно как обработчик ошибок, который должен вызываться, когда / если какой-либо обработчик запроса вызывает next(err)
или если синхронное исключение перехватывается Express.
У Express есть обработчик ошибок по умолчанию, если вы не предоставляете его, о котором вы можете прочитать здесь . Но, если вы предоставите его, тогда ваш возьмет верх, и вы сможете делать все, что захотите, из обработчика ошибок. Вы даже можете просто зарегистрировать ошибку и перевести пользователя на страницу ошибки — вам даже не нужно отправлять http-статус ошибки, если это запрос веб-страницы. Если это API, вам, вероятно, следует использовать статусы ошибок http.
какова наилучшая практика?
Рекомендуется включить свой собственный экспресс — обработчик ошибок , в котором вы сможете перехватывать все ошибки , которые отправляются на next(err)
.
Я подумал о том, чтобы поместить промежуточное программное обеспечение сразу после него и вызвать res.send с кодом ошибки и состояния 400 или, может быть, обернуть все мои сторонние промежуточные программы обработчиком try-catch
Ваше стороннее промежуточное программное обеспечение должно правильно работать в экосистеме Express. Это означает, что он может выдавать данные синхронно, а Express автоматически перехватит их и отправит в обработчик ошибок Express. Код не должен генерироваться асинхронно (как это верно для всех типов кода), потому что никто не может перехватить эти исключения (если они не находятся в коде, структурированном обещаниями). Вам не нужно оборачивать промежуточное программное обеспечение самостоятельно.
Внутренние ошибки, как правило, должны быть не ошибками 4xx, а скорее ошибками 5xx. Сообщаете ли вы о внутренней ошибке конечному пользователю или нет, полностью зависит от контекста. Обычно пользователю будет показана какая-то страница ошибок общего назначения. Или, если это API, API будет иметь схему передачи сообщений об ошибках, и обычно API возвращает фактические коды состояния http, которые соответствующим образом соответствуют типу проблемы.
Комментарии:
1. @NaorTedgi — Это сработало для вас?
2. Ваш ответ был действительно информативным, большое спасибо, но я ищу пример реализации кода
3. @NaorTedgi — я привел пример, и ссылка на документацию, которую я вам дал, показывает пример. Обратите внимание, конечно, что еще вы хотите?
Ответ №2:
после дальнейшего изучения это лучшее решение, подходящее для меня, просто добавляющее другое промежуточное программное обеспечение после анализа тела
https://www.npmjs.com/package/express-body-parser-error-handler