Ошибка запуска транзакции Firebase cloud

#typescript #google-cloud-firestore #google-cloud-functions

#typescript #google-cloud-firestore #google-cloud-функции

Вопрос:

Я пытаюсь создать распределенный счетчик с помощью транзакции Firestore. У меня есть коллекция записей, каждая из которых содержит вложенную коллекцию «count_shards». В каждом из них есть три документа (1, 2, 3), которые содержат поле «count».

Когда я создаю документ «нравится» для публикации, я хочу выбрать случайный документ и увеличить его на 1. У меня есть следующий код Typescript:

 import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

exports.addShard = functions.firestore
    .document(`likes/{docID}`)
    .onCreate(async (snap, context) => {
        const postID: string = snap.data().postID;
        const randNum: number = (Math.floor(Math.random()*3 1)); 
        const postRef = admin.firestore().doc(`post/${postID}/count_shards/${randNum}`);

        admin.firestore().runTransaction(async transaction => {
            const postShard = (await transaction.get(postRef)).data();
            postShard.count  = 1;
            return transaction.update(postRef, postShard);
        });

    });
  

Я получаю следующие сообщения об ошибках:

«ОШИБКА: /Users//firecast/functions/src/index.ts[13, 9]: обещания должны обрабатываться надлежащим образом»

«функции@ lint: tslint --project tsconfig.json «

У кого-нибудь есть идеи, что я здесь делаю не так?

Ответ №1:

runTransaction возвращает обещание. Вам нужно await это.

     await admin.firestore().runTransaction(...);
  

Ответ №2:

runTransaction Метод возвращает Promise . И, как говорится в этом сообщении в блоге, вы должны вернуть это Promise .

И это важно:

…если вы хотите, чтобы функция оставалась активной во время асинхронной работы, вы можете сделать это, вернув обещание от функции (за исключением триггеров HTTP / S, которые требуют ответа, отправленного клиенту).

Или другими словами: если вы не вернете это Promise , ваша функция может завершиться без завершения transaction .

 import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

exports.addShard = functions.firestore
    .document(`likes/{docID}`)
    .onCreate(async (snap, context) => {
        const postID: string = snap.data().postID;
        const randNum: number = (Math.floor(Math.random()*3 1)); 
        const postRef = admin.firestore().doc(`post/${postID}/count_shards/${randNum}`);

        return admin.firestore().runTransaction(async transaction => {
            const postShard = (await transaction.get(postRef)).data();
            postShard.count  = 1;
            return transaction.update(postRef, postShard);
        });

    });