Express центральная обработка ошибок с app.use - PullRequest
0 голосов
/ 07 апреля 2020

Эй, ребята, я хочу добиться центральной обработки ошибок в express, я сделал это.

app.use(function(err,req,res,next){
    logger.error(err);
    utils.jsonOutHandler(err,null,res);
    next(err);
});

app.get('/',(req,res)=>{
    throw new Error('Testing');
});

Также я создал специальный метод jsonOutHandler, который отправляет правильный ответ пользователю.

function jsonOutHandler(err, result, out) {
    if (err) {
        let status = 500;
        const message = 'Something broke';
        if (err instanceof DbError) {
            status = 500;
        }
        if (err instanceof ValidationError) {
            status = 400;
        }
        if (err instanceof SystemError) {
            status = 500;
        }
        out.status(status).send({message});
        return;
    }

    out.status(result.status).send({data: result.data});

}

Но всякий раз, когда я выдаю ошибку по маршруту '/', мой обработчик ошибок никогда не срабатывает. Почему?

1 Ответ

0 голосов
/ 07 апреля 2020

Express основан на промежуточном программном обеспечении, поэтому, если вы хотите перехватить ошибки внутри промежуточного программного обеспечения, вам следует вызвать промежуточное программное обеспечение для ошибок:

app.get('/',(req,res)=>{
    next(new Error('Testing'));
});

/**
 * middleware to catch errors happened before this middleware
 * express knows this middleware is for error handling because it has
 * four parameters (err, req, res, next)
 **/
app.use((err, req, res, next) => {
  res.status(500).send({
    message: err.message,
  });
});

Я надеюсь, что вы сможете адаптировать этот пример к вашим требованиям. Следует иметь в виду, что промежуточное ПО для ошибок может использоваться из предыдущих промежуточных программ. В вашем примере вы не смогли отловить ошибку, потому что ваше промежуточное ПО было определено до вашего основного маршрутизатора app.get ('/')

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