javascript - 我的函数没有正确解析吗?此外,它不会将 firebase 写入数据库。没有错误

标签 javascript firebase google-cloud-firestore google-cloud-functions

我有一个云函数,运行没有错误,但是,在 Promise.all 之后它不会写入数据库

我已经在网络浏览器中测试了这个函数,数据似乎在 Promise.all 之后正确解析。当我将其放入云函数中时,Promise.all 之后的 console.log() 显示原始数据而不是更新的数据,就好像它跳过 forEach 并立即解析一样。当函数在浏览器中运行时,我没有得到这种行为。

最重要的是,如果数据在 Promise 之后,则不会写入 Firestore。在此之前写入的所有数据都会顺利进行。

exports.scheduledIndexUpdate = functions.pubsub
  .schedule("every 30 minutes")
  .onRun(context => {
    console.log("This will be run every 30 minutes!");

    var newIndex;
    var getIndex = new Promise((resolve, reject) => {
      admin
        .firestore()
        .collection("billsIndex")
        .doc("GS2019Index")
        .get()
        .then(doc => {
          if (doc.exists) {
            newIndex = doc.data();
            resolve(newIndex);
          }
        });
    });
    return getIndex.then(index => {
      var keys = Object.keys(index);

      keys.forEach(function(key) {
        admin
          .firestore()
          .collection("billsMetaData")
          .doc(key)
          .get()
          .then(doc => {
            if (doc.exists) {
              const metaData = doc.data();
              let agree = 0,
                disagree = 0,
                neutral = 0,
                somewhatAgree = 0,
                somewhatDisagree = 0;

              if (metaData.votes) {
                if (metaData.votes.agree) {
                  agree = metaData.votes.agree;
                }
                if (metaData.votes.disagree) {
                  disagree = metaData.votes.disagree;
                }
                if (metaData.votes.neutral) {
                  neutral = metaData.votes.neutral;
                }
                if (metaData.votes.somewhatAgree) {
                  somewhatAgree = metaData.votes.somewhatAgree;
                }
                if (metaData.votes.somewhatDisagree) {
                  somewhatDisagree = metaData.votes.somewhatDisagree;
                }

                newIndex[key].userVotes =
                  agree + disagree + neutral + somewhatAgree + somewhatDisagree;
              }
            }
          });
      });
      Promise.all(keys).then(function(result) {

          admin
            .firestore()
            .collection("billsIndex")
            .doc("GS2019Index2")
            .set({
              newIndex
            });
          console.log(newIndex);
          console.log("done");

      });
    });
   });

如有任何帮助,我们将不胜感激!

最佳答案

看来您正在尝试在 getIndex 仍然不可用时使用它,请查看异步操作...使用 async/await 您可以重构代码以使其看起来像这样

exports.scheduledIndexUpdate = functions.pubsub
  .schedule("every 30 minutes")
  .onRun(async context => {
    console.log("This will be run every 30 minutes!");

    var newIndex;
    var getIndex = await admin.collection("billsIndex")
                                .doc("GS2019Index")
                                .get()
                                .then(doc => doc.exists ? doc.data() : null);
    // you have you docs available here 
    for (let prop of getIndex) {
        await admin
          .firestore()
          .collection("billsMetaData")
          .doc(key)
          .get()
          .then(() => { /..,/ })
          // etc
    }

    await admin.firestore().collection("billsIndex")
      .doc("GS2019Index2")
            .set({
              newIndex
            });
    return Promise.resolve(/.../)

这样你就可以强制执行等待,直到 promise 得到解决

关于javascript - 我的函数没有正确解析吗?此外,它不会将 firebase 写入数据库。没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56800763/

相关文章:

android - 无法解析 : com. google.firebase :firebase-database:10. 2.0

android - FCM 通知 - 多个设备

firebase - 当 Internet 连接恢复时,Firestore 不会立即开始监听更改

javascript - jQuery/以编程方式在选择框中选择一个选项

javascript - vue.js 中的多个条件

javascript - 在 View 中绑定(bind)数组元素

iOS 火力地堡登录

上传到存储时 Firebase Uncaught [object Object]

javascript - Crypto.randomBytes 处理异常对熵不足有何影响?

javascript - 有关在 Firebase 云函数内部生成一致日期的问题