ExpressJS:承诺和错误处理中间件
问题描述:
我有一些错误处理中间件定义和返回承诺的路线。但是,当承诺出现错误时,我必须在每次承诺后手动附加.catch(err => next(err))
。虽然它不是问题,ExpressJs看看路由是否返回承诺并且自动调用错误处理中间件是不明智的。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
?
答
我已经提交了duplicate bug
截至目前最好的办法似乎是使用wrap function。
另请参阅上面的@robertklep的评论。如果您不使用route-params
,则可能会使用promise-express-router
。 express-co
似乎是一个包装功能+更多基于生成器的善良
不确定是否切换框架是您的选择,但http://koajs.com/原生地使用promise。写一个捕捉中间件是微不足道的koa.js – Herku
@Herku,我不能为这个项目,但会看看koa为下一个项目肯定。看看它,看起来很容易使用[koa-router](https://github.com/alexmingoia/koa-router) –
有许多模块可以为Express提供承诺支持,例如['promise- express-router'](https://github.com/ufo22940268/promise-express-router)和['express-ko'](https://github.com/ex-machine/express-ko)(这也是恰好为快车实施了一些Koa-goodness)。也许它是有用的。 – robertklep