【问题标题】:Firebase cloud transaction triggers errorFirebase 云交易触发错误
【发布时间】:2019-07-27 15:30:33
【问题描述】:

我正在尝试通过 Firestore 事务创建分布式计数器。我有一个帖子集合,每个帖子都有一个“count_shards”的子集合。它们每个都有三个包含“计数”字段的文档(1、2、3)。

当我为帖子创建“喜欢”文档时,我想选择一个随机文档并将其递增 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"

有人知道我在这里做错了什么吗?

【问题讨论】:

    标签: typescript google-cloud-firestore google-cloud-functions


    【解决方案1】:

    runTransaction 返回一个承诺。你需要await它。

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

    【讨论】:

      【解决方案2】:

      runTransaction 方法返回一个Promise。 正如this blog post 所说:您必须返回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);
              });
      
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-17
        • 2015-07-15
        • 2018-08-03
        • 2010-09-06
        • 1970-01-01
        • 2018-06-09
        • 2021-11-27
        • 2018-09-14
        相关资源
        最近更新 更多