我需要一个每天自动触发一次的云函数,并在我的"用户";集合,其中";观看";字段为true,并将所有字段更新为false。我得到了";13:26错误解析错误:意外的令牌MyFirstRef";在部署我的功能时,我的终端中出现了此错误。我不熟悉js,所以任何人都可以纠正函数。谢谢
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const { snapshotConstructor } = require("firebase-functions/lib/providers/firestore");
admin.initializeApp();
exports.changeWatched = functions.pubsub.schedule("every 24 hours").onRun((context) => {
const MyFirstRef = admin.firestore().collection("users")
const queryRef = await MyFirstRef.where("watched", "==", true).get().then((snapshot) => {
snapshot.docs.forEach( doc => {
console.log("debug");
const realId = doc.id
const MyRef = await admin.firestore().collection("users").doc(realId)
MyRef.update({watched: false})
})
})
});
代码中有几点需要更正:
- 当所有异步作业完成时,您需要返回一个Promise。有关更多详细信息,请参阅此文档
- 如果使用
await
关键字,则需要声明函数async
,请参见此处 QuerySnapshot
具有forEach()
方法- 只需使用
ref
属性,就可以从QuerySnapshot
中获取文档的DocumentReference
因此,以下内容应该起作用:
exports.changeWatched = functions.pubsub.schedule("every 24 hours").onRun(async (context) => { // <== See async
const db = admin.firestore();
const batch = db.batch();
const snapshot = await db.collection("users").where("watched", "==", true).get();
snapshot.forEach(doc => {
batch.update(doc.ref, { watched: false });
});
return batch.commit(); // Here we return the Promise returned by commit()
});
请注意,我们使用的是批处理写入,它最多可以包含500个操作。如果您需要在一次Cloud Function执行中更新更多文档,请使用Promise.all()
或将批处理分为多个批处理。
Promise.all()
版本:
exports.changeWatched = functions.pubsub.schedule("every 24 hours").onRun(async (context) => { // <== See async
const db = admin.firestore();
const snapshot = await db.collection("users").where("watched", "==", true).get();
return Promise.all(snapshot.docs.map(doc => doc.ref.delete());
});