如何从 pub 子函数更新 Firestore 字段

Posted

技术标签:

【中文标题】如何从 pub 子函数更新 Firestore 字段【英文标题】:How to update a Firestore field from a pub sub function 【发布时间】:2020-05-05 08:20:27 【问题描述】:

我已经设置了一个 pub/sub 函数来每分钟触发一次,我想检查当前时间是否等于任何 Firestore 实体的开始时间,然后更改一个值:

exports.updateDraftStatus = (event, context) => 
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage, 'base64').toString());

  const db = admin.firestore();
  time = admin.firestore.Timestamp.fromMillis(Date.now())
  const snap = db.collection("leagues").where("startTime", time).get()
  await Promise.all(snap.docs.map(doc => doc.ref.update(Started: 'Off')));
;

【问题讨论】:

【参考方案1】:

.get() method 返回 Promise<QuerySnapshot>,而不是 QuerySnapshot。您需要await 快照,或使用then() 块。

exports.updateDraftStatus = async (event, context) => 
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage, 'base64').toString());

  const db = admin.firestore();
  time = admin.firestore.Timestamp.fromMillis(Date.now())
  const snap = await db.collection("leagues").where("startTime", time).get()
  await Promise.all(snap.docs.map(doc => doc.ref.update(Started: 'Off')));
;

exports.updateDraftStatus = (event, context) => 
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage, 'base64').toString());

  const db = admin.firestore();
  time = admin.firestore.Timestamp.fromMillis(Date.now())
  return db.collection("leagues").where("startTime", time).get().then((snap) => 
    return Promise.all(snap.docs.map(doc => doc.ref.update(Started: 'Off')));
  )
;

【讨论】:

谢谢弗兰克我会尝试这个解决方案,我已经将它更改为您的建议,但现在我收到一个错误,管理员未定义我已在 json 包中的依赖项下添加了管理员,但仍然未定义有什么建议吗? 这听起来像是一个不同的问题,与您如何将admin 包导入index.js 相关。它应该类似于const admin = require('firebase-admin');

以上是关于如何从 pub 子函数更新 Firestore 字段的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 Firestore 与 Pub/Sub

在 Flutter 中更新 firestore 后,项目无法编译

如何从 Firestore 制作父/子对象流

如何在从firestore数据库获取数据时修复状态更新

如何使用 Firestore 函数更新地图中的数组?

是否可以从firebase云函数node.js更新firestore中的map类型字段?