【发布时间】:2023-04-01 09:28:01
【问题描述】:
我定义了一些错误处理中间件和一个返回承诺的路由。但是当该承诺出现错误时,我必须在每个承诺之后手动附加.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-router和express-ko(这也恰好为 Express 实现了一些 Koa-goodness)。也许有用。 -
@robertklep promise-express-router 不错,但缺少路由参数和其他一些功能。恕我直言,最好使用答案中的简单包装功能。
express-ko看起来像一个 wrap function + generators 。还是谢谢 -
上面提到的模块几乎没有被大量生产人员使用,因此在未来采用最好的情况是有问题的。检查每个存储库的 star/watch 计数以确定这一点。
标签: javascript node.js express promise sequelize.js