首页 > 解决方案 > 简单标识函数超出了最大调用堆栈大小?

问题描述

为了与这个问题保持一致,我发送了一个简单的明确定义的 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 (<anonymous>)。也许我应该console.log函数接收的参数。

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

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

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

我的日志

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

uid: 'J0xMj8OVn4Voc6yb547itgjt2iC3' } } }

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

标签: javascriptfirebasegoogle-cloud-functions

解决方案


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


推荐阅读