【问题标题】:firebase cloud functions oncall returns nullfirebase 云函数 oncall 返回 null
【发布时间】:2020-08-17 13:24:34
【问题描述】:

想知道什么是奇怪的错误。

我正在使用 firebase 云函数中的 onCall 方法,但是当我从我的应用程序中读取它时,它会返回 null 值。我正在尝试返回一些测试数据,但它似乎不起作用。我是否错误地返回了数据?

index.js


    exports.handleMassFollowAnalytics = functions.https.onCall((data, context) => {
      const brandArray = data.brandArray;
      const followed = data.followed;

      let done = 0;
      for (var i = 0; i < brandArray.length; i++) {
        let brand = brandArray[i];
        admin.database()
          .ref(`brands/${brand}/followers`)
          .transaction(function(post) {
              if (post !== null) {
                post--;
              }
              return post;
            },

            function(error, committed, snapshot) {
              done++;
              if (done === brandArray.length) {
                // returning result.
                return {
                  data: "testabc",
                };
              }
            }
          );
      }
    });


app.js

    const handleMassFollowAnalytics = firebase
      .functions()
      .httpsCallable("handleMassFollowAnalytics");
    handleMassFollowAnalytics({
      brandArray: array,
      followed: true,
    }).then((result) => {
      console.log("result: ", result) // returns null everytime
    });

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    您的函数需要返回一个承诺,该承诺与要发送给客户端的数据一起解析。现在,您的函数什么也不返回。事务回调中的 return 语句不是从 main 函数返回的。

    此外,代码忽略了您正在执行的事务返回的承诺。函数返回的最终 Promise 必须在所有其他 Promise 都解决后才解决。

    【讨论】:

    • 嗨,Doug,感谢您对此的回复。你认为有什么资源可以指导我这样做吗?
    • 对非现场参考或教程的请求与 Stack Overflow 无关。通过网络搜索,您应该能够找到很多关于 JavaScript 编程的信息。
    • 似乎已经为此设计了答案。感谢您为我指明正确的方向。
    【解决方案2】:

    所以,我利用Doug的信息,得出以下答案,以供日后参考。

    这对我来说似乎返回正确。

    1. 返回个人承诺
    2. 返回最终承诺

    index.js

        exports.handleMassFollowAnalytics = functions.https.onCall((data, context) => {
          const brandArray = data.brandArray;
          const followed = data.followed;
    
          var promises = [];
          for (var i = 0; i < brandArray.length; i++) {
            let brand = brandArray[i];
            promises.push(admin.database()
              .ref(`brands/${brand}/followers`)
              .transaction(function(post) {
                  if (post !== null) {
                    post--;
                  }
                  return post;
                });
            );
          }
    
          return Promise.all(promisess).then((result)=>{
              return {
                  data: "testabc",
              }
          })
        });
    

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2019-02-27
      • 2019-02-01
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多