Как вы обрабатываете ошибки, вызванные сторонним промежуточным программным обеспечением в express?

#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