Многократное чтение документа в узле JS Firestore транзакции - PullRequest
0 голосов
/ 15 мая 2018

Я хочу выполнить транзакцию, которая требует обновления двух документов с использованием предыдущих значений этих документов.

Ради вопроса я пытаюсь передать 100 токенов от одного пользователя приложения другому.Эта операция должна быть атомарной, чтобы сохранить целостность данных моей БД, поэтому на стороне сервера я, хотя и использую 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);
});

Ответы [ 2 ]

0 голосов
/ 13 августа 2018

Вы можете использовать getAll. См. Документацию на https://cloud.google.com/nodejs/docs/reference/firestore/0.15.x/Transaction?authuser=0#getAll

0 голосов
/ 15 мая 2018

Вы можете использовать Promise.all() для генерации одного обещания, которое разрешается, когда все обещания в массиве, переданные ему, разрешены. Используйте это обещание, чтобы продолжить работу после того, как все ваши чтения документа будут завершены - он будет содержать все результаты. Общая форма вашего кода должна быть такой:

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...
})
...