firebase - TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator)) at Function.all () Firebase 云功能
问题描述
我以这种方式设置了云功能:
exports.changeIsVisibleFieldAfterDay = functions.pubsub
.schedule("every 2 minutes").onRun((context) => {
const d = new Date();
d.setDate(d.getDate() - 1);
return db.collectionGroup("Moments")
.where("isVisible", "==", true)
.where("timestamp", "<=", d)
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
Promise.all().doc.ref.update({isVisible: false}, {merge: true});
});
return null;
});
});
当我插入Promise.all()
以更新子集合中的所有文档时,我收到此错误:
TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
at Function.all (<anonymous>)
当我不使用Promise.all()
文档时会正确更新,但我知道如果我想更新大量文档,我需要一个Promise
.
解决方案
根据 Mozilla JS参考,该promise.All
函数需要一组承诺作为输入,因为您没有提供一个错误警告您未定义(即无参数)不可迭代。
实际上你想要的是类似于下面的代码(已经测试过):
db.collectionGroup("Moments")
.where("isVisible", "==", true)
.where("timestamp", "<=", d)
.get()
.then((querySnap) => {
// Create an array of the promises returned by update()
let promises = [];
querySnap.forEach((doc) => {
promises.push(doc.ref.update({hello:"yes"}, {merge: true}))
});
// Resolve the promises
Promise.all(promises)
.then((x) => console.log("Docs updated"))
.catch((err) => console.error(err));
});
推荐阅读
- ignite - Ignite.NET 不支持异步查询是否有特定原因?
- django - Django Channels 2:两种身份验证方法
- google-apps-script - 单击按钮后变量的值未更新
- xslt - xpath 中的 XSLT 计数器
- c# - 如何将列表列表绑定到 WPF 中的列表框?
- node.js - 如何在 Puppeteer 节点 js 中使用 setinterval
- css - 如何在引导程序 4 上找到导致奇怪行为的原因
- c - 如何将二进制文件中的结构写入另一个二进制文件中的嵌套结构?
- mysql - MySQL 实例无法连接 (AWS)
- c - 如何使用 Visual Studio 2017(调试模式)将输入 txt 文件(而不是自己输入)设置为参数?