【问题标题】:Errorhandling in middleware does not pass error中间件中的错误处理不会传递错误
【发布时间】:2019-02-27 16:07:30
【问题描述】:

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

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

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

【问题讨论】:

  • 您有多个错误处理程序吗?意思是,签名为function (err, req, res, next) {} 的函数不止一个。 loader 函数长什么样子?
  • loader 是我在帖子中写的第一个异步函数。

标签: node.js express


【解决方案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
    }
  })

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 酷,我刚刚读到异步控制器应该总是有 try/catch。我会试试你的方法
    • 我不推荐 ChuongTran 解决方案。当我在express 中检查Request 类型时,没有列出像error 这样的属性。修改对象,当你不坚持它们的类型时不是一个好主意,它会在应用程序中造成这样的混乱。另外,这个.use 不是一个好的解决方案,因为根据 express 文档,这不是一个真正的错误处理程序,它可能会导致许多意想不到的事情发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多