异常的通用catch版本?

时间:2016-06-28 12:32:24

标签: node.js express sequelize.js

我有一个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
       });

但是我不想将它添加到每个请求中,是否有一些通用的方法来捕获这些错误?

2 个答案:

答案 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转换器