【问题标题】:Maximum call stack size exceeded for simple identity function?简单标识函数超出了最大调用堆栈大小?
【发布时间】:2020-10-07 03:48:01
【问题描述】:

根据this question,我发送了一个简单的定义良好的 json 对象,并从我的简单云函数返回一个简单的定义良好的 json 对象。云端功能代码如下:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(); // (Apparently you don't need to pass any config values here?)

export const sendMessage = functions.https.onCall(async (data, context) => {
  try {
    return {
      data,
      context
    };
  } catch (error) {
    throw new functions.https.HttpsError('aborted', error);
  }
});

这是我的网络应用程序的调用代码:

 const sendMessage_CF = firebase.functions().httpsCallable('sendMessage');

  const sendMessage = async () => {
    try {
      const response = await sendMessage_CF({ body: 'test message' });
      console.log(response);
    } catch (error) {
      console.error('Error', error);
    }
  };

生成的日志是:

 Function execution took 1138 ms, finished with status code: 500 
 sendMessage
Unhandled error RangeError: Maximum call stack size exceeded at Object (<anonymous>) at 
/workspace/node_modules/lodash/lodash.js:4919:24 at baseForOwn 
(/workspace/node_modules/lodash/lodash.js:2990:24) at Function.mapValues 
(/workspace/node_modules/lodash/lodash.js:13426:7) at encode 
(/workspace/node_modules/firebase-functions/lib/providers/https.js:184:18) at 
/workspace/node_modules/lodash/lodash.js:13427:38 at 
/workspace/node_modules/lodash/lodash.js:4925:15 at baseForOwn 
(/workspace/node_modules/lodash/lodash.js:2990:24) at Function.mapValues 
(/workspace/node_modules/lodash/lodash.js:13426:7) at encode 
(/workspace/node_modules/firebase-functions/lib/providers/https.js:184:18)

就是这么简单的一个函数,基本上就是hello world,所以....我真的说不上是什么问题。

baseForOwn 似乎是类似于 forEach 的对象键的 lodash 内部实现,但我不知道 Object (&lt;anonymous&gt;) 是什么。也许我应该console.log函数接收的参数。

编辑:所以我将这一行添加到云函数的顶部:

  console.log('PARAMS', data, context);

发生的事情是 1 次调用添加了 50 个新日志。奇怪的是,他们都没有提到“PARAMS”或记录整个对象。似乎每一个都是来自datacontext 的一个属性,也许,就好像在每个键的每个键上都调用了一个console.log。剧情变厚了??

实际上,最后记录的位是这样的:

uid: 'J0xMj8OVn4Voc6yb547itgjt2iC3' } } }

就好像它用换行符打破了日志语句!我对此感到很困惑。更不用说我最初的“PARAMS”不包括在任何地方。对于它的价值,如果我 console.log 本身没有数据/上下文的字符串文字,它会正确记录,每次调用一次。

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    context,它是一个CallableContext 对象,并不像你想象的那么简单。函数端的 Firebase SDK 在将其序列化为 JSON 时遇到问题,可能是因为它包含导致无限循环的自引用数据。只需将其从响应中删除,或从中挑选出您希望客户端接收的更清晰简单的数据。

    【讨论】:

    • 射击。我应该尝试返回一些不同的东西,看看问题是否出在其中。我没有想到。谢谢你。显然data 也是如此,因为我在删除context 时遇到了同样的错误。编辑:没关系,一定是缓存问题。问题解决了!
    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2017-07-02
    • 2020-11-19
    • 2013-08-23
    • 2021-09-07
    • 2017-11-12
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多