这是我的代码段:
await firestore.runTransaction(t => {
t.get(docRef)
.then(docRef => {
logger.info("entering transaction");
if (!docRef.exists) {
t.create(docRef, new Data);
return Promise.resolve();
} else {
t.update(docRef, {aField: updateData});
return Promise.resolve();
}
})
.catch(error => {
return Promise.reject(error);
});
})
这给了我以下错误:
Error: You must return a Promise in your transaction()-callback. at transaction.begin.then (/srv/node_modules/@google-cloud/firestore/build/src/index.js:496:32) at <anonymous>
这是我第一次使用Firestore事务语法,并且我对Node.js Promise概念和语法相当了解。我模仿了Firestore交易示例here并编写了以上代码段。
发生错误后,我尝试将Promise.resolve()
更改为Promise.resolve(0)
,但徒劳。
我还尝试删除await
,而改用.then
,但这仍然给我同样的错误。
请点亮一些灯光。欣赏它。谢谢。
答案 0 :(得分:1)
您基本上需要return
这个承诺。另外,如果t.create
和t.update
也返回了一个承诺,则可以将其返回。不要执行return Promise.resolve()
,这是错误的,因为它会在实际插入或创建之前之前解决。
假设一切正常,您需要执行以下操作:
await firestore.runTransaction(t => {
return t.get(docRef)
.then(docRef => {
logger.info("entering transaction");
if (!docRef.exists) {
return t.create(docRef, new Data);
} else {
return t.update(docRef, { aField: updateData });
}
})
.catch(error => {
return Promise.reject(error);
});
})
答案 1 :(得分:0)
回顾示例,我意识到我错过了return
中的return t.get()
,但是指出这一错误绝不是显而易见的错误。