尝试实现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
答案 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会自动提交事务。如果您没有使用回调样式进行交易,那么您应该保留它。在我的例子中,我使用了回调样式。