中间件中的错误处理不会传递错误

时间:2019-02-27 07:22:57

标签: node.js express

基本上我得到了一个异步函数,像这样:

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()传递给该Express函数时,该错误在某处丢失了...:

  .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 :(得分:1)

我在此post找到了解决方案,您可以尝试这段代码吗?

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
    }
  })

答案 1 :(得分:1)

我不是控制器内的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
})