Node JS Firestore事务中的多个文档读取

Dor*_*ori 5 node.js firebase firebase-admin google-cloud-firestore

我要执行一个事务,该事务需要使用这些文档的先前值来更新两个文档。

为了解决这个问题,我正在尝试将100个令牌从一个应用程序用户转移到另一个应用程序用户。此操作必须是原子性的,以保持DB的数据完整性,因此在服务器端虽然可以使用admin.firestore().runTransaction

据我了解,runTransaction需要在执行写入操作之前执行所有读取操作,那么在更新数据之前如何读取两个用户的余额?

这是我到目前为止的内容:

db = admin.firestore();
const user1Ref = db.collection('users').doc(user1Id);
const user2Ref = db.collection('users').doc(user2Id);
transaction = db.runTransaction(t => {
    return t.get(user1Ref).then(user1Snap => {
        const user1Balance = user1Snap.data().balance;
        // Somehow get the second user's balance (user2Balance)
        t.update(user1Ref , {balance: user1Balance - 100});
        t.update(user2Ref , {balance: user2Balance + 100});
        return Promise.resolve('Transferred 100 tokens from ' + user1Id + ' to ' + user2Id);
    });
}).then(result => {
    console.log('Transaction success', result);
});
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 4

您可以使用它Promise.all()来生成单个 Promise,当传递给它的数组中的所有 Promise 都已解析时,该 Promise 才会解析。在所有文档读取完成后,使用该承诺继续工作 - 它将包含所有结果。代码的一般形式应该是这样的:

const p1 = t.get(user1Ref)
const p2 = t.get(user2Ref)
const pAll = Promise.all([p1, p2])
pAll.then(results => {
    snap1 = results[0]
    snap2 = results[1]
    // work with snap1 and snap2 here, make updates to refs...
})
Run Code Online (Sandbox Code Playgroud)