首页 > 解决方案 > 如何从 pub 子函数更新 Firestore 字段

问题描述

我已经设置了一个 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'})));
};

标签: javascriptgoogle-cloud-firestoregoogle-cloud-pubsub

解决方案


.get()方法返回 a Promise<QuerySnapshot>,而不是 a 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'})));
  })
};

推荐阅读