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

2024-03-22

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

我当前的缩短代码:

// 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每次?


This is 已经提交 https://github.com/expressjs/express/issues/2259.

我已经提交了一份重复的错误 https://github.com/expressjs/express/issues/3031

截至目前,最好的选择似乎是使用换行功能 https://github.com/blakeembrey/async-middleware .

另请参阅上面@robertklep 的评论。promise-express-router https://github.com/ufo22940268/promise-express-router如果你不使用可能会有用route-params . express-co https://github.com/ex-machine/express-ko似乎是一个包装函数+更多基于生成器的优点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ExpressJS:承诺和错误处理中间件 的相关文章

随机推荐