首页 > 解决方案 > 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.

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


根据 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));
    });

推荐阅读