Облачная транзакция Firebase вызывает ошибку - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь создать распределенный счетчик через транзакцию 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]: обещания должны обрабатываться соответствующим образом»

"functions @ lint: tslint --project tsconfig.json"

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

Ответы [ 2 ]

1 голос
/ 06 марта 2019

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

    await admin.firestore().runTransaction(...);
0 голосов
/ 06 марта 2019

Метод runTransaction возвращает 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);
        });

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