Могу ли я получить доступ к req (например, req.body) в пользовательском обработчике ошибок в Express? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь написать экспресс-промежуточное программное обеспечение, где я записываю определенные заголовки req и res и записываю их во внешнюю базу данных.

Часть этого - создание собственного обработчика ошибок, в котором я могу записать мои err.stack, err.message, req.body, req.params и req.url во внешний файл или приложение.

Я попытался создать свой собственный обработчик ошибок и вызвать его последним в иерархии app.use (). В моих маршрутах я выбрасываю новую ошибку, и в моем собственном обработчике ошибок я пытаюсь зарегистрировать ошибку и req.body. Однако ничего не регистрируется, кроме ошибки.

app.js

app.use(responseTime());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(multilogger({extended: false, development: true, interval: 5000}));
app.use(multiError);

app.use('/', indexRouter);

случайный маршрут

router.post("/", function(req, res, next) {
  return next(new Error("Oh no!"));
});

Настраиваемая ошибка

module.exports = function (err, req, res, next) {
    console.error(err.message); //only this gets logged
    console.error(req.body); // this doesn't appear
    next(err);
};

Я хочу деструктурировать объект req моего API-вызова в моем собственном обработчике ошибок, чтобы я мог делать с ним другие вещи.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 мая 2019

Вы испытываете это, потому что Express оценивает все промежуточное ПО / маршруты в порядке их добавления в Express.Вызов next() буквально означает «перейти к следующему возможному обработчику, который соответствует этому запросу».В большинстве случаев существует только один маршрут, который соответствует запрошенному URI, это означает, что следующим возможным обработчиком будет обработчик, для которого не указан маршрут.

В Express вы определяете обработчик ошибок по умолчанию и обработчик 404 без маршрутов, после всех других промежуточных программ / маршрутов.Обработчик 404 всегда должен быть последним маршрутом в вашем приложении Express.

Обработчик ошибок по умолчанию также является специальным промежуточным программным обеспечением, поскольку он принимает 4 параметра, первый из которых является ошибкой.Важно проверить, определена ли ошибка, потому что Express вызовет обработчик ошибок по умолчанию, если не найдено ни одного маршрута, поскольку для него не указан маршрут.Вот почему обработчик 404 всегда идет после обработчика ошибок по умолчанию, так как он является ловушкой для всех запросов, которые не соответствуют маршруту, и в этих случаях не будет ошибок.

Подробнее о Написание промежуточного программного обеспечения , Использование промежуточного программного обеспечения & Обработка ошибок в Express.

const express = require('express')
const bodyParser = require('body-parser')
const PORT = process.env.PORT || 1337

// not sure where this is in your code based on question info
const indexRouter = require('./indexRouter') 

const app = express()

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

// Your Router
app.use('/', indexRouter)

// Default Error Handler
app.use((err, req, res, next) => {
  // This is necessary to detect any unmatched routes that should be a 404
  if (!err) {
    return next()
  }

  // Handle Error and Respond
})

// 404 Handler, No Route Defined Matched the Requested Route
app.use((req, res) => res.sendStatus(404))

app.listen(PORT, () => console.log(`Listening on ${Port}`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...