序列化自定义验证程序未处理的承诺拒绝

时间:2020-05-07 16:55:39

标签: node.js sequelize.js es6-promise

以下是验证程序的文档:https://sequelize.org/master/manual/validations-and-constraints.html。它说如果失败则抛出错误

说我有一个用户表,我只希望添加最多500个用户,所以我创建了一个验证器:

{
    sequelize,
    tableName: 'users',
    validate: {
      limitUsers: async function(x) {
          const count = await sequelize.models.User.count({...});
          if (count > 500) {
            throw new Error(
              `blah blah`,
             );
          }
        }
      },
    },
  },

创建用户时,它是交易的一部分,但呼叫看起来像

 try {

    const user = await user.create(
      {
       ...
      },
      { transaction },
    );
  } catch (e) {
    console.log('Handle error here');
    ....
  }

由于某种原因,catch不会抛出验证器中抛出的错误,而只是抛出500,而没有击中catch。为什么会这样呢?我只是不明白诺言如何运作?

1 个答案:

答案 0 :(得分:0)

看来验证器必须是同步的,这就是为什么同步验证器或等待异步验证器都不会捕获来自它们的拒绝的原因。

可能的原因可能是验证程序必须快速并且不要使用查询(否则将存在将事务传递给验证程序的问题)。

复杂的异步验证应该在模型之外,并且应该在调用任何数据修改操作之前执行。