【问题标题】:Firebase Function execution took 60004 ms, finished with status: 'timeout' Error: memory limit exceeded. Function invocation was interruptedFirebase 函数执行耗时 60004 毫秒,完成状态为:“超时”错误:超出内存限制。函数调用被中断
【发布时间】:2020-12-28 04:25:48
【问题描述】:

我每周运行一个脚本。当我的集合中的文档少于 9k 时,一切正常。我已经尝试使用异步函数等到 foreach 结束。但它没有用。你能帮我处理异步函数吗?

代码:

exports.weeklyPointReset = functions.pubsub.schedule('12 04 * * 1').timeZone('UTC').onRun((context) => {


  return db.collection('Users').where('weeklyPoint', '!=', 0).orderBy('weeklyPoint', 'desc').get().then(async (snapshot) => {
    var counter = 1;
    if (snapshot.empty) {
      return null;
    } else {
      const promises = [];
      await snapshot.forEach(async (doc) => {
        await promises.push(doc.ref.update({ weeklyPoint: 0 }));
      });
      return await Promise.all(promises);
    }
  }).catch(error => {
    console.log(error);
    return null;
  });
});

【问题讨论】:

    标签: node.js firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    既然您要返回Promise.all(),请去掉所有多余的await 语句和async 关键字:

    exports.weeklyPointReset = functions.pubsub.schedule('12 04 * * 1').timeZone('UTC').onRun((context) => {
      return db.collection('Users').where('weeklyPoint', '!=', 0).orderBy('weeklyPoint', 'desc').get().then((snapshot) => {
        if (snapshot.empty) {
          return null;
        } else {
          const promises = [];
          snapshot.forEach((doc) => {
            promises.push(doc.ref.update({ weeklyPoint: 0 }));
          });
          return Promise.all(promises);
        }
      }).catch(error => {
        console.log(error);
        return null;
      });
    });
    

    现在每条路径(据我所知)都返回一个承诺,云函数应该在正确的时刻终止。


    另外,我认为您可以将 else 块简化​​为:

    return Promise.all(snapshot.docs.map((doc) => doc.ref.update({ weeklyPoint: 0 }));
    

    【讨论】:

    • 它没有用。 “错误:超出内存限制。函数调用被中断。”
    • 感谢您的回复 Frank,我的代码与您发布的代码相同,但 forEach 花费了很多时间,然后出现超时错误,因此我在代码中添加了 async 和 await。它也没有奏效。我的目标是将每个文档中的 weekPoint 字段更新为“0”,如果您为此建议另一种解决方案,我会很高兴。提前谢谢你。
    • @AlesaSeel 除了 Frank 建议的微调之外,您还应该尝试增加内存和超时值,请参阅 firebase.google.com/docs/functions/…
    • Renaud 提到的增加内存和超时值是否解决了问题?
    【解决方案2】:

    感谢您的回复。 Renaud,我找到了像你提到的那样增加记忆力的方法。解决方案;

    1. 转到https://console.cloud.google.com/functions/list
    2. 选择函数,然后点击编辑,
    3. 设置内存大小和超时值。 (超时最大限制为 540sn)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 2019-01-08
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2020-09-17
      相关资源
      最近更新 更多