【问题标题】:Increase field value by 1 every minute每分钟将字段值增加 1
【发布时间】:2019-11-22 23:58:37
【问题描述】:

我正在尝试将 Firestore 字段的值每分钟增加 1,因此我创建了一个预定的云函数:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
const db = admin.firestore();

const ref = db.collection('count').doc('currentTrack');

export const everyMinuteJob = functions.pubsub
  .schedule('every 1 minutes').onRun(context => {
    ref.get().then( value => {
      if (value.exists) {
        const id = value.data().id + 1;
        ref.update({ id });
      }
    });
  });

部署此代码我收到以下错误:

错误 TS2532:对象可能是“未定义”: const id = value.data().id + 1;

我已经尝试了多种方法,但它们总是在错误中解决。

这种行为的正确方法是什么?

【问题讨论】:

  • 我为您的直接问题提供了答案,但您将遇到另一个问题,即您没有处理ref.update() 返回的承诺。这个问题与你现在面临的问题无关,但它仍然是一个问题。
  • @DougStevenson 谢谢,我会仔细阅读!

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


【解决方案1】:

value 将是一个DocumentSnapshot 类型的对象。根据 API 文档,它的 data() 方法可以返回 DocumentData 或未定义。为了满足严格的 TypeScript 检查,您必须检查未定义的情况才能使用返回的 DocumentData 对象。 value.event 之前是否返回 true 无关紧要 - TypeScript 不会在 exists 属性和 data() 的返回值之间建立任何联系。

  if (value.exists) {
    const data = value.data();
    if (data) {
      // now TypeScript has a guarantee that data is not undefined
      const id = value.data().id + 1;
      ref.update({ id });
    }
  }

【讨论】:

  • 谢谢!还必须将const id = value.data().id + 1; 更改为const id = data.id + 1;,但我假设您完全忘记了这一点。另一个奇怪的事情是,初始字段值是 1 - 现在我通过云函数添加 1 (+ 1) - 它是 11。
  • 那是因为您将 1 附加到字符串值。 id 必须是数字,而不是字符串。
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多