ExpressJS:承诺和错误处理中间件

Posted

技术标签:

【中文标题】ExpressJS:承诺和错误处理中间件【英文标题】:ExpressJS: Promises and Error Handling middleware 【发布时间】:2016-10-31 00:16:14 【问题描述】:

我定义了一些错误处理中间件和一个返回承诺的路由。但是当该承诺出现错误时,我必须在每个承诺之后手动附加.catch(err => next(err))。虽然这不是问题,但 ExpressJs 是否明智地查看路由是否返回承诺,如果返回,则自动调用错误处理中间件。

我当前的缩短代码:

// errorHandlers.js
function sequelizeValidationError (err, req, res, next) 
  if (err.name && err.name == 'SequelizeValidationError')
    res.status(400).send(err.errors)
  else next(err)


// auth.js
router.post ('/register',  middleware.isNotAuthenticated, (req, res, next) => 
  const  email, password, name  = req.body;

  return models.User.find(where :  email ).then(user => 
    if (user) 
      if (user.password == password) sendToken(user.id, res);
      else res.sendStatus(401);
     else 
      return models.User.create(
        email, password, name
      ).then(user => 
        sendToken(user.id, res);
      )
    
  ).catch(next)
)

// index.js
router.use('/auth', require('./auth'))

router.use(errorHandlers.sequelizeValidationError)

例如,目前我可能忘记在一个地方写catch,服务器就会出现故障。

我错过了什么吗?如何避免每次都输入catch

【问题讨论】:

不确定切换框架是否适合您,但 koajs.com 可以原生地使用 Promise。在 koa.js 中编写一个捕获中间件是微不足道的 @Herku ,我不能参加这个项目,但肯定会为下一个项目考虑 koa。看了一下,用koa-router看起来蛮好用的 有各种模块为 Express 提供了 Promise 支持,例如 promise-express-routerexpress-ko(这也恰好为 Express 实现了一些 Koa-goodness)。也许有用。 @robertklep promise-express-router 不错,但缺少路由参数和其他一些功能。恕我直言,最好使用答案中的简单包装功能。 express-ko 看起来像一个 wrap function + generators 。还是谢谢 上面提到的模块几乎没有被大量生产人员使用,因此在未来采用最好的情况是有问题的。检查每个存储库的 star/watch 计数以确定这一点。 【参考方案1】:

这是already filed。

我已经提交了duplicate bug

到目前为止,最好的选择似乎是使用wrap function。

另见上面@robertklep 的评论。如果您不使用 route-paramspromise-express-router 可能会有用。 express-co 似乎是一个包装函数 + 更多基于生成器的优点

【讨论】:

即将推出 Express v5 github.com/expressjs/express/issues/2259#issuecomment-433586394

以上是关于ExpressJS:承诺和错误处理中间件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js expressjs 的异步对象方法中处理未处理的承诺拒绝?

ExpressJS - 抛出未处理的错误事件

使用带有 expressjs 的 multer 上传文件时的错误处理

如何处理错误然后立即脱离承诺链?

即使 Expressjs 中存在错误处理程序,AWS 也会显示它自己的错误屏幕

javascript 承诺所有运行所有承诺和处理程序错误