Почему моя транзакция Firebase истекла или больше не действительна? - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужна помощь по использованию транзакций в моем приложении firebase / angular 6.

У меня есть это:

    let transactionResult;
    try {
        transactionResult = await db.runTransaction(trans => {
            console.log('running transaction');
            const result = trans.commit();
            console.log('result =', result);
            return result;
        });
    } catch (err) {
        console.log('catching error; err =', err);
    }
    console.log('transactionResult =', transactionResult);

Я получаю это для вывода:

running transaction
info: result = Promise { <pending> }
info: catching error; err = { Error: 10 ABORTED: The referenced transaction has expired or is no longer valid.
at Object.exports.createStatusError (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/grpc/src/common.js:87:15)
at Object.onReceiveStatus (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:1188:28)
at InterceptingListener._callNext (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:564:42)
at InterceptingListener.onReceiveStatus (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:614:8)
at callback (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:841:24)
code: 10,
metadata: Metadata { _internal_repr: {} },
details: 'The referenced transaction has expired or is no longer valid.',
note: 'Exception occurred in retry method that was not classified as transient' }

Я не знаком с тем, как работают транзакции, поэтому я не знаю, что означает, что «указанная транзакция истекла или больше не действительна» или «Исключение произошло в методе повтора, который не был классифицирован».как переходный процесс ».Я пытаюсь выполнить как можно более простую транзакцию.Поэтому я запускаю commit () и возвращаю результаты.Вот и все.Я думаю, это будет достаточно просто для работы.

Если я не сделаю ничего в транзакции следующим образом:

        transactionResult = await db.runTransaction(trans => {
            console.log('running transaction');
        });

Я получу это:

info: running transaction
info: catching error; err = Error: You must return a Promise in your transaction()-callback.
at transaction.begin.then (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/index.js:494:32)
at <anonymous>

Если я возвращаю выполненное обещание следующим образом:

        transactionResult = await db.runTransaction(trans => {
            console.log('running transaction');
            return Promise.resolve();
        });

Я получаю это:

info: running transaction
info: running transaction
info: running transaction
info: running transaction
info: running transaction
info: catching error; err = TypeError: Cannot read property 'seconds' of null
at Function.fromProto (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/timestamp.js:91:47)
at _firestore.request.then.resp (/Users/gibranshah/repos/EVABlockchain/functions/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/write-batch.js:472:42)
at <anonymous>

Кажется, что транзакция несколько раз запускается, пока она не попытается прочитать «секунды» изпустой объект.

Какая самая простая транзакция, которую я могу написать, будет работать?

1 Ответ

0 голосов
/ 12 февраля 2019

Оказывается, вам нужно сделать хотя бы одно чтение и одну запись.Делая так:

    transactionResult = await db.runTransaction(trans => {
        console.log('running transaction');
        const ref = db.collection(colPath).doc(docPath);
        return trans.get(ref).then(doc => {
            const d = doc.data();
            // update data
            return trans.set(ref, d);
        });
    });

... делает свое дело.Я возвращаю результаты набора, и это, кажется, удовлетворяет транзакции (то есть она фиксирует и не повторяется, и нет ошибок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...