我试图在事务中使用async / await。 但是得到错误"论证" updateFunction"不是有效的功能。"
var docRef = admin.firestore().collection("docs").doc(docId);
let transaction = admin.firestore().runTransaction();
let doc = await transaction.get(docRef);
if (!doc.exists) {throw ("doc not found");}
var newLikes = doc.data().likes + 1;
await transaction.update(docRef, { likes: newLikes });
答案 0 :(得分:7)
以上内容对我不起作用,并导致以下错误:“ [错误:还必须写入在事务中读取的每个文档。]”。
下面的代码利用async / await并正常工作。
[[], [], [], [], ['arid', 'dash'], ['drain'], ['thread']]
答案 1 :(得分:2)
如果查看docs,您会发现传递给runTransaction
的函数是一个返回诺言的函数(transaction.get().then()
的结果)。由于异步函数只是一个返回诺言的函数,因此您最好编写db.runTransaction(async transaction => {})
如果要将数据从事务中传递出去,则仅需要从此函数返回某些内容。例如,如果仅执行更新,则不会返回任何内容。还要注意,update函数返回事务本身,因此您可以将它们链接起来:
try {
await db.runTransaction(async transaction => {
transaction
.update(
db.collection("col1").doc(id1),
dataFor1
)
.update(
db.collection("col2").doc(id2),
dataFor2
);
});
} catch (err) {
throw new Error(`Failed transaction: ${err.message}`);
}
答案 2 :(得分:1)
看一下文档,runTransaction必须接收updateFunction函数作为参数。 (https://firebase.google.com/docs/reference/js/firebase.firestore.Firestore#runTransaction)
试试这个
var docRef = admin.firestore().collection("docs").doc(docId);
let doc = await admin.firestore().runTransaction(t => t.get(docRef));
if (!doc.exists) {throw ("doc not found");}
var newLikes = doc.data().likes + 1;
await doc.ref.update({ likes: newLikes });
答案 3 :(得分:0)
就我而言,运行事务的唯一方法是:
const firestore = admin.firestore();
const txRes = await firestore.runTransaction(async (tx) => {
const docRef = await tx.get( firestore.collection('posts').doc( context.params.postId ) );
if(!docRef.exists) {
throw new Error('Error - onWrite: docRef does not exist');
}
const totalComments = docRef.data().comments + 1;
return tx.update(docRef.ref, { comments: totalComments }, {});
});
我需要将我的'collection()。doc()'直接添加到tx.get中,并且在调用tx.update时,我需要应用'docRef.ref',而没有'.ref'不能正常工作...