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

вопрос создан в Thu, May 2, 2019 12:00 AM

Я пытаюсь написать экспресс-промежуточное программное обеспечение, в котором я записываю определенные заголовки 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
  1. поместите это в ваш случайный маршрут console.error(req.body) и посмотрите, регистрируется ли он
    2019-05-02 16: 12: 27Z
  2. Где вы вводите Custom Error, чтобы открыть приложение?
    2019-05-02 16: 35: 13Z
  3. В конце, перед маршрутизатором. app.use(multierror);
    2019-05-03 12: 55: 56Z
1 ответ                              1                         

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

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

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

Подробнее о создании промежуточного программного обеспечения , Использование Middleware & Обработка ошибок в 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}`))
    
0
2019-05-02 16: 23: 44Z
  1. Большое спасибо. Ваше объяснение было действительно полезным, и моя ошибка действительно заключалась в том, что мое промежуточное ПО с ошибками было последним из промежуточного ПО, но еще до app.use (route); Размещение в конце решило проблему для меня. Спасибо, @peteb!
    2019-05-03 13: 04: 32Z
источник размещен Вот