关于node.js:中间件中的错误处理不会传递错误

Errorhandling in middleware does not pass error

基本上,我得到了这样的异步函数:

1
2
3
4
5
6
7
8
9
10
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函数时,该错误会丢失在某处...:

1
2
3
4
5
6
7
  .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");
  })

有人知道我在做什么错吗?我想利用上面函数中的错误。


我不是控制器内try/catch的忠实拥护者,错误处理程序中间件应该处理它们。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
})


我在这篇文章中找到了解决方案,您可以尝试使用此代码吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
    }
  })