如何捕获所有类型的sequelize错误

时间:2017-10-27 10:38:21

标签: node.js sequelize.js

我使用sequelize@4.8.0和expressJS。

我理解如何捕捉特定类型的续集错误并且效果很好。

return db.mySequel.transaction(t => {
    return db.users.findOrCreate({
        ...,
        transaction: t
    }).spread((rs, created) => {
        if (created == false) throw new Error("00001");
        return db.misc.bulkCreate([
            {
                ...
            },
            {
                ...
            }
        ], {
            transaction: t,
            raw: true
        });
    })
}).then(rs => {
    res.json(rs);
}).catch(db.mySequel.ForeignKeyConstraintError, err => {
   ... 
}).catch(err => {
   ...
});

但是这个查询事务进程也会抛出自定义错误实例。所以我想从我的错误中分别捕获所有类型的Sequelize Error。

也许我可以制造更多的捕获链,看起来很冗长。 我尝试了.catch(db.mySequel.BaseError但没那么有用。

2 个答案:

答案 0 :(得分:3)

使用单个catch块而不是使用多个catch块,然后测试对象的instanceof以确定如何处理异常。

.catch(err => {
  if (err instanceof db.mySequel.ForeignKeyConstraintError) {
    // handle foreign key constraint
  } else {
    // handle other error
  }
});

答案 1 :(得分:0)

我在文档提到的Error类中找到了继承关系。

我可以抓住与Object.getInstanceOf()方法的关系。 __proto__属性也有意义,但我更喜欢更严格的规则。 (尽管__proto__采用了javascript引擎的大部分内容。它只是事实上的标准。)

这就是我的方式:

var names = [];
(function p (inst) {
    if (inst != null) {
        var ofProto = Object.getPrototypeOf(inst);
        names.push(ofProto.constructor.name);
        p(ofProto);
    }
})(err);
console.log(names)
// ["ForeignKeyConstraintError", "DatabaseError", "BaseError", "Error", "Object"]

现在可以找出错误的来源。