узел express глобальная попытка поймать вместо специфицированных c единиц - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь настроить приложение express, чтобы ловить любые throw new error из центральной функции вместо многих try и catch

var app = express();

tenantsRouter.get('/my_endpoint', async function(req, res, next) {
   
    var result = await methodThatCouldFail()

    res.status(HttpStatus.OK).json({result);
});

app.use(apiPrefix + '/tenants', tenantsRouter);




error_handler = function(err, req, res, next) {

  console.error(`general error catcher - ${err}.`)

  return res.status(HttpStatus.BAD_REQUEST).json({
    'error': 'we are on it.'
  })


}
// error handler
app.use(error_handler)



Дело в том, если я не использую Speci c try и catch в my_endpoint error_handler не ловит throw new Error внутри методаThatCouldFail ();

1 Ответ

1 голос
/ 03 августа 2020

API только , который Express предоставляет для передачи ошибок вниз по цепочке обработчиков, осуществляется через функцию next(). Вам нужно обернуть его вокруг чего-то, что будет делать try / catch и вызывать next() за вас:

function asyncHandler (f) {
    return function (req, res, next) {
        f(req, res, next).catch(next)
    }
}

Теперь вы можете сделать:

tenantsRouter.get('/my_endpoint', asyncHandler(async function(req, res, next) {
    var result = await methodThatCouldFail()

    res.status(HttpStatus.OK).json({result);
}));

Что будет работать именно так вы ожидали, что это сработает.

На самом деле существует несколько реализаций этого простого модуля на npm, если вам не хочется писать его самостоятельно, включая эту: https://www.npmjs.com/package/express-async-handler

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