Firebase:使用async / await进行交易

时间:2018-04-04 06:55:03

标签: javascript firebase google-cloud-firestore

我试图在事务中使用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 });

4 个答案:

答案 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'不能正常工作...