Обработка ошибок в промежуточном программном обеспечении не пропускает ошибку - PullRequest
0 голосов
/ 27 февраля 2019

В основном я получил асинхронную функцию, такую ​​как:

export default (htmlFilePath, observer, redisClient) => async (req, res, next) => {

 try {
  ...bunch of logic...
 } catch (error) {
  // if i log error here it displays correctly
  next(error)
 }

}

Так что, если код подходит к описанному выше улову, я могу правильно использовать ошибку со stackTrace и т. Д., Но при передаче ее с помощью next () перейти кэта ошибка экспресс-функции где-то потеряна ...:

  .get('/*', loader(filePath, observer, redisClient))
  .use(function (err, req, res, next) {
    res.statusCode = 500;
    // Logger only logs: TEST
    logger.error('TEST', err, err.stack);
    res.send("Internal Server Error");
  })

Кто-нибудь знает, что я делаю неправильно?Я хочу использовать ошибку в функции выше.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я не большой поклонник try/catch внутри контроллеров, промежуточное ПО обработчика ошибок должно их обрабатывать.

С https://expressjs.com/en/advanced/best-practice-performance.html#handle-exceptions-properly

app.get('/', function (req, res, next) {
  // do some sync stuff
  queryDb()
    .then(function (data) {
      // handle data
      return makeCsv(data)
    })
    .then(function (csv) {
      // handle csv
    })
    .catch(next)
})

app.use(function (err, req, res, next) {
  // handle error
})
0 голосов
/ 27 февраля 2019

Я нашел решение в этом сообщении , вы можете попробовать этот код?

function loader(req, filePath, observer, redisClient, next) {
try {
  ...bunch of logic...
 } catch (error) {
  // if i log error here it displays correctly
    req.error  = error;
 }
 next();
}

api.get('/*', loader(req, filePath, observer, redisClient))
  .use(function (req, res, next) {
    // Logger only logs: TEST
    var err = req.error;
    if(err){
        logger.error('TEST', err, err.stack);
        res.send("Internal Server Error");
    }else{
        //Do something here
    }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...