【问题标题】:Firebase cloud function error: Maximum call size stack size exceededFirebase 云函数错误:超出最大调用大小堆栈大小
【发布时间】:2021-11-03 14:50:24
【问题描述】:

我制作了 firebase 云功能,向用户添加了他或她已付款的声明(为用户设置为 true):

 const admin = require("firebase-admin");
 
 exports.addPaidClaim = functions.https.onCall(async (data, context) => {
       // add custom claim (paid)
       return admin.auth().setCustomUserClaims(data.uid, {
         paid: true,
       }).then(() => {
         return {
           message: `Succes! ${data.email} has paid for the course`,
         };
       }).catch((err) => {
         return err;
       });
     });

但是,当我运行此函数时:我收到以下错误:“未处理的拒绝(RangeError):超出最大调用堆栈大小”。我真的不明白为什么会这样。有人知道是什么导致了被召回的内容,进而导致函数永远不会结束吗?

【问题讨论】:

  • 尝试用throw new functions.https.HttpsError('internal', error.message);替换return err;
  • 我仍然遇到同样的错误
  • 您是否尝试过删除和重新部署您的函数?我看不出你写的东西有什么问题
  • 我有,但这并没有什么不同。如何在 firebase 中调试此功能?我没有收到任何关于导致这么大的调用堆栈大小的反馈

标签: firebase firebase-realtime-database firebase-authentication google-cloud-functions


【解决方案1】:

异步操作需要返回一个如documentation 中所述的promise。因此,Cloud Functions 尝试将事务返回的 Promise 中包含的数据序列化,然后以 JSON 格式发送给客户端。我相信您的 setCustomClaims 不会发送任何对象以将其视为对完成该过程的承诺的回答,因此它会保持在引发范围错误的等待循环中。

为了避免这个错误,我可以想到两种不同的选择:

  • 添加一个付费参数以便能够发送 JSON 响应(如果不需要更改用户访问控制,则删除 setCustomUserClaim,因为they are not designed to store additional data)。

  • 插入一个promise,解析并发送任何需要的信息给客户端。比如:

      return new Promise(function(resolve, reject) {
        request({
          url: URL,
          method: "POST",
          json: true,
          body: queryJSON //A json variable I've built previously
        }, function (error, response, body) {
          if (error) {
            reject(error);
          } 
          else {
            resolve(body)
          } 
        });
      });

【讨论】:

  • 好的,但是在这种情况下,数据用于存储访问控制。尽管从长远来看,这可能并不方便。我应该使用 firebase 实时数据库吗? queryjson 应该由什么组成? setCustomUserClaims?
  • 您可以保留 setCustomClaims(),只需添加另一个您可以发送的变量来完成承诺。在不了解您的应用程序的情况下,很难知道 RDB 或常规数据存储是否足够。在正文中,您需要添加等待客户端的响应,即使只有一个带有确认的字符串就足够了。
猜你喜欢
  • 2019-11-30
  • 2021-04-06
  • 2019-05-04
  • 2021-01-21
  • 2018-11-12
  • 2011-08-31
  • 1970-01-01
  • 2018-06-03
  • 2019-07-19
相关资源
最近更新 更多