创建计数器时未定义Firebase Cloud Functions onCreate对象

我有一个名为dashboard的根集合,并且在其中有一个名为totalUserCountry的文档。在此文档中,我有一个带有一堆国家名称的属性。每个值都是一个数字。

该想法是使该功能在每次将新用户添加到数据库中并在总数中添加 ADD 1 时运行。

但是,我遇到一个错误。这是我的代码:

import * as functions from 'firebase-functions';
import admin = require('firebase-admin');

const db = admin.firestore();

export const onAddUser = functions.firestore.document('users/{userID}')
    .onCreate(async (snapshot,context) => {
        let snapCountry = snapshot.get('country');
        snapCountry.toLowerCase();

        return db.runTransaction(async transaction => {
            const dashboardPath = db.collection('dashboard').doc('totalUserCountry');
            const dashsnap = await transaction.get(dashboardPath);
            const dashTotalUserData = dashsnap.data();
            const changes = { snapCountry: dashTotalUserData.snapCountry + 1 };
        })
    });

我得到的错误是

  

对象可能是'undefined'.ts(2532)

这种情况发生在dashTotalUserData语句上的const changes = { snapCountry: dashTotalUserData.snapCountry + 1 };

有任何提示或建议吗?

wfeng_bit 回答:创建计数器时未定义Firebase Cloud Functions onCreate对象

如果data()快照不存在,

undefined可以返回dashSnap

因此,您应该按照以下方式修改代码:

  if (dashTotalUserData) {
    const changes = { snapCountry: dashTotalUserData.snapCountry + 1 };
    //....
  }

此外,请注意,您需要在交易中返回update()方法返回的承诺,请参见https://firebase.google.com/docs/firestore/manage-data/transactions#transactions

在您当前的代码中,增量值没有更新。


最后,如果我理解正确,请按如下所示构建对象:

const changes = { snapCountry: dashTotalUserData.snapCountry + 1 };

您计划在snapCountry文档中使用与totalUserCountry值相对应的名称来更新该字段的值。

请注意,此对象将更新snapCountry字段,而不更新名为usabelgiumfrance等的国家/地区字段。

如果这种理解是正确的,则应使用square-bracket notation,如下所示:

let changes = {};
changes[snapCountry] = dashTotalUserData.snapCountry + 1;
,

Firestore实际上本身就支持atomic increment,因此您根本不需要进行事务处理,并且这可以大大简化(并且更高效,因为更新完全在服务器端进行!)。>

您可以执行以下操作,而不是返回整个db.runTransaction块:

...
        snapCountry.toLowerCase();

        const dashboardPath = db.collection('dashboard').doc('totalUserCountry');
        return dashboardPath.update(snapCountry,admin.firestore.FieldValue.increment(1));
    });

此代码还避免了您当前可能不存在该字段的问题,因为增量将以传递给增量的值创建该字段(例如,假设以前不存在该字段,则为零)。

当然,Firestore的扩展限制也只有每秒每文档一次更新,因此,随着您的应用程序扩展,此反文档将开始受到重创。

实际上,Firestore记录了整个solution for distributed counters,该记录将增量文件分片到许多文档中,然后在读取结果时将结果汇总到所有文档中。从长远来看,与增加单个文档中的单个字段相比,这种方法更具可伸缩性。

本文链接:https://www.f2er.com/3163662.html

大家都在问