javascript - 简单标识函数超出了最大调用堆栈大小?
问题描述
为了与这个问题保持一致,我发送了一个简单的明确定义的 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”或记录整个对象。似乎每个都是来自data
or的一个属性context
,也许,就好像在每个键的每个键上都调用了一个 console.log 。剧情变厚了??
实际上,最后记录的位是这样的:
uid: 'J0xMj8OVn4Voc6yb547itgjt2iC3' } } }
就好像它用换行符打破了日志语句!我对此感到很困惑。更不用说我最初的“PARAMS”不包括在任何地方。对于它的价值,如果我自己console.log
的字符串文字没有数据/上下文,它会正确记录,每次调用一次。
解决方案
context
,它是一个CallableContext对象,并不像你想象的那么简单。函数端的 Firebase SDK 在将其序列化为 JSON 时遇到问题,可能是因为它包含导致无限循环的自引用数据。只需将其从响应中删除,或从中挑选出您希望客户接收的更清晰简单的数据。
推荐阅读
- laravel - 请求关于在 Laravel 中接收令牌错误的指导
- python - 为什么 python lambda 看到的是一个系列而不是一个值?
- java - Springboot URl 映射
- jquery - 在 ASP.NET Core 中的下拉值更改时从数据库中获取值
- c - 使用 pthread 库在线程之间进行同步
- python - 如何计算数据集的元素由列表组成
- python - 如何使用 pyodbc 在嵌套循环中调用不同的查询
- javascript - Vanilla JavaScript:如何搜索对象数组,键是数组
- python - 如何使用 Python 和来自 cricinfo 的 BeautifulSoup 提取玩家姓名
- list - 方案二进制列表到小数和