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

时间:2016-06-28 15:16:11

标签: javascript node.js express promise sequelize.js

我有一些错误处理中间件定义和一个返回承诺的路由。但是当这个承诺出错时,我必须在每个承诺之后手动附加.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

1 个答案:

答案 0 :(得分:0)

这是already filed

我提交了duplicate bug

截至目前,最好的选择似乎是使用wrap function

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