每分钟将字段值增加 1

Posted

技术标签:

【中文标题】每分钟将字段值增加 1【英文标题】:Increase field value by 1 every minute 【发布时间】: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 谢谢,我会仔细阅读! 【参考方案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 必须是数字,而不是字符串。

以上是关于每分钟将字段值增加 1的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 设置表的属性值自动增加

将 Cakephp 数据库字段增加一个值

关于mysql中自增加的ID问题

mysql自动增加的字段怎么设置初始值

SQL语句问题,查询时间字段与上条数据间隔小于10分钟的数据

求助 使MYSQL 时间字段里的值增加30天的 SQL语句咋写 - 技术问答