Sequelize交易错误

时间:2017-08-15 09:20:38

标签: javascript node.js postgresql express sequelize.js

尝试实现oauth2。坚持续集交易。

获取错误:

  

执行(9edf48f7-5823-4b4f-b444-faa4c1896831):START TRANSACTION;

     

执行(9edf48f7-5823-4b4f-b444-faa4c1896831):COMMIT;

     

未处理拒绝错误:已在此调用提交   交易(9edf48f7-5823-4b4f-b444-faa4c1896831),你不能再   用它。 (被拒绝的查询被附加为此属性的' sql属性   误差)

`

at.save({transaction: t}).then(() => {
                rt.save({transaction: t}).then(() => {
                    t.commit();
                    return done(false, accessToken, refreshToken, {
                        expires_at: expires,
                        scope: scope});
                }).error(function(
                    err) {
                    t.rollback();
                    return done(err);
                });
            }).error(function(err) {
                t.rollback();
                return done(err);
            });

使用Postgres Sequelize 4.x.x

1 个答案:

答案 0 :(得分:5)

使用自动提交功能处理Sequelize事务时,需要确保从每个查询返回promise。看起来你没有从嵌套查询返回promise,这意味着你的原始promise在第一个提交事务的查询之后解析。为了等待整个提交链完成,你必须返回嵌套的promises。

return sequelize.transaction(t => {
  return at.save({ transaction: t })
    .then(() => {
      return rt.save({ transaction: t })
        .then(() => {
          return t.commit() // Commit also returns a promise, you will want that to finish too
            .then(() => {
              return done();
            });
        });
    });
});

在上面的示例中,您可以完全省略t.commit()调用,因为如果承诺链解析,Sequelize会自动提交事务。如果您没有使用回调样式进行交易,那么您应该保留它。在我的例子中,我使用了回调样式。

祝你好运! :)