我有一个sequelize数据库,用于验证数据并引发错误。
我知道我可以做这样的事情来捕捉并输出我的错误:
User.build()
.catch(Sequelize.ValidationError, function (err) {
// respond with validation errors
return res.status(422).send(err.errors);
})
.catch(function (err) {
// every other error
return res.status(400).send({
message: err.message
});
但是我不想将它添加到每个请求中,是否有一些通用的方法来捕获这些错误?
答案 0 :(得分:1)
您可以向req
(或res
)添加自定义方法,以解决承诺并处理任何错误:
app.use((req, res, next) => {
req.resolve = (promise) => {
return promise.catch(Sequelize.ValidationError, err => {
// respond with validation errors
return res.status(422).send(err.errors);
}).catch(err => {
// every other error
return res.status(400).send({ message: err.message });
});
});
next();
});
用法(假设在路由之前添加了上面的中间件):
router.post('/user', (req, res) => {
req.resolve(User.build()).then(user => res.json(user));
});
答案 1 :(得分:1)
ES.next版本(2016):
您可以使用throw
使用从官方strongloop网站复制的此包装函数的异步函数:
let wrap = fn => (...args) => fn(...args).catch(args[2]);
然后在路由器/控制器中执行此功能:
router.post('/fn/email', wrap(async function(req, res) { ...throw new Error(); }
最后有一个正常捕获所有错误的中间件:
app.use(function(err, req, res, next) { console.log(err); }
显然,为了实现这一目标,您需要当前的babel转换器