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

问题描述 投票:0回答:2

基本上我有一个像这样的异步函数:

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

}

因此,如果代码来到上面的catch我可以正确使用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");
  })

谁知道我做错了什么?我想利用上面函数中的错误。

node.js express
2个回答
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
投票

我不是控制器内的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
})
© www.soinside.com 2019 - 2024. All rights reserved.