2017-08-15 125 views
0

尝试实施oauth2。与继续交易陷入困境。续订交易错误

四处错误:

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

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

Unhandled rejection Error: commit has been called on this transaction(9edf48f7-5823-4b4f-b444-faa4c1896831), you can no longer use it. (The rejected query is attached as the 'sql' property of this error)

`

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); 
      }); 

Sequelize 4.XX在Postgres

回答

1

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

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自动提交,如果承诺链解决了交易。如果你没有使用回调风格进行交易,那么你应该保持那种状态。在我的例子中,我使用了回调风格。

祝你好运! :)