Как обрабатывать ошибки в Express 4 из приложения Node.Js? - PullRequest
0 голосов
/ 19 февраля 2020

Я обновился до Express 4, и у меня возникла следующая проблема с обработкой ошибок.

Раньше у меня был код в app.js - после всех возможных маршрутов у меня было

var routes = require('./routes')
app.use(routes.notfound)
app.use(routes.error)
app.use(routes.badrequest)

А потом внутри /routes/index.js у меня было:

exports.notfound = function(req, res) {
    res.status(404).format({
        html: function() {
            res.render('404')
        },
        json: function() {
            res.send({
                message: 'We did not find what you were looking for :(',
            })
        },
        xml: function() {
            res.write('<error>\n')
            res.write(
                ' <message>We did not find what you were looking for :(</message>\n'
            )
            res.end('</error>\n')
        },
        text: function() {
            res.send('We did not find what you were looking for :(\n')
        },
    })
}

Теперь, когда я вызываю 404 в другом месте приложения (не в app.js), используя res.send(404), я получаю правильный ответ 404 кода но я не дохожу до части, где он выбирает, показывает ли он html или json или текст.

Как мне это сделать?

1 Ответ

0 голосов
/ 19 февраля 2020

Вам нужно обрабатывать ошибки по-разному, вот один из способов сделать это:

Создайте промежуточное ПО после всех ваших маршрутов, которое будет перехватывать ошибки, которые вы передаете ему, обратный вызов будет принимать дополнительный параметр содержит подробности об ошибке:

app.use((err, req, res, next) => {
  // Handle the error here
});

Всякий раз, когда вы хотите отобразить ошибку, вы можете использовать next в своих маршрутах, чтобы передать ее этому промежуточному программному обеспечению и передать дополнительную информацию, которую вы можете использовать, чтобы решить, как обработать ошибку. Существует модуль под названием http-errors , который может создавать подобные объекты для вас. Вот пример маршрута:

const createError = require('http-errors');

app.get('/posts', (req, res, next) => {
  // Logic...
  if(/* some condition */) {
    next(createError(404));
  }
});

Это передаст созданный объект ошибки в ваше промежуточное ПО для обработки ошибок, и оттуда вы можете выбрать, как его обработать.

Чтобы расширить это, и чтобы улучшить его работу с асинхронным кодом, вы можете обернуть обратные вызовы вашего маршрутизатора функцией, которая будет гарантировать, что исключения, которые вызываются, передаются промежуточному программному обеспечению для обработки ошибок, это удобно при работе с async и await:

// Wrapper function to forward errors from async scopes
const wrap = fn => (...args) => fn(...args).catch(args[2]);

app.get('/posts', wrap(async (req, res) => {
  // Logic...
  await controller.get('posts'); // Promise rejections will get forwarded to middleware
}));

Это также позволяет просто throw объект ошибки вместо вызова next.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...