如何解决使用 node.js 进行 Firestore、查询和更新
我需要一个每天自动触发一次的云函数,并在我的“用户”集合中查询“监视”字段为真并将所有这些都更新为假。部署我的函数时,我在终端中收到“13:26 错误解析错误:意外令牌 MyFirstRef”这个错误。 我对 js 不熟悉,所以任何人都可以请更正函数。谢谢。
belongsTo($related,$foreignKey = null,$ownerKey = null,$relation = null)
解决方法
您的代码中有几点需要更正:
- 当所有异步作业完成时,您需要返回一个 Promise。有关详细信息,请参阅此 doc。
- 如果使用
await
关键字,则需要声明函数async
,请参阅 here。 -
QuerySnapshot
有一个forEach()
方法 - 您只需使用
ref
属性即可从DocumentReference
获取文档的QuerySnapshot
。
因此,以下内容应该可以解决问题:
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()
});
请注意,我们使用了一个 batched write,它最多可以包含 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());
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。