从今天早上开始,我们的Firebase应用程序在将数据写入Realtime Database实例时出现了问题。即使是最简单的任务,比如向对象添加一个键值对,也会触发
Error: TRIGGER_PAYLOAD_TOO_LARGE: This request would cause a function payload exceeding the maximum size allowed.
这特别奇怪,因为我们的代码或数据库在超过24小时内没有任何变化。
即使是像这样简单的事情
Database.ref('environments/' + envkey).child('orders/' + orderkey).ref.set({a:1})
触发错误。
显然,有效负载的大小不是问题,但是是什么导致了这种情况呢?
数据库结构,根据要求
`environments +-env1 +-env2 --+orders ---+223344 -----customer: "Peters" -----country: "NL" -----+items ------item1 -------code: "a" -------value: "b" ------item2 -------code: "x" -------value: "2"`
发布于 2018-05-25 14:26:46
好了,我想通了。该问题与您的写入函数无关,而是与写入操作将触发的云函数之一有关。
例如,我们在JSON中有一个类似:/collections/data/abcd/items/a
的结构:
"collections": {
"data": {
"abc": {
"name": "example Col",
"itemCount": 5,
"items": {
"a": {"name": "a"},
"b": {"name": "b"},
"c": {"name": "c"},
"d": {"name": "d"},
"e": {"name": "e"},
}
}
}
}
任何写入项的操作都是完全失败的。API、Javascript,甚至是控制台中的基本编写。
我决定查看我们的云函数,并发现了以下内容:
const countItems = (collectionId) => {
return firebaseAdmin.database().ref(`/collections/data/${collectionId}/items`).once('value')
.then(snapshot => {
const items = snapshot.val();
const filtered = Object.keys(items).filter(key => {
const item = items[key];
return (item && !item.trash);
});
return firebaseAdmin.database().ref(`/collections/meta/${collectionId}/itemsCount`)
.set(filtered.length);
});
};
export const onCollectionItemAdd = functions.database.ref('/collections/data/{collectionId}/items/{itemId}')
.onCreate((change, context) => {
const { collectionId } = context.params;
return countItems(collectionId);
});
就其本身而言,它什么都不是,但该触发器读取所有项,并且默认情况下,firebase云函数会将整个快照发送到CF,即使我们不使用它。事实上,它也会发送之前和之后的值,所以如果你(像我们一样)在这一点上有大量的项目,我猜它试图发送给云函数的有效负载太大了。
我从CF和boom中删除了计数函数,恢复到正常状态。如果我们根本没有触发器,我不确定计数的“正确”方式,但如果我们有触发器,我会更新这个……
发布于 2018-05-31 08:25:47
TRIGGER_PAYLOAD_TOO_LARGE错误是Firebase正在推出的一项新功能的一部分,其中我们的existing RTDB limits是严格执行的。更改的原因是为了确保我们不会静默地删除任何云函数触发器,因为任何超过这些限制的事件都不能被发送到函数。
您可以通过执行此REST调用自行关闭此功能:
curl -X PUT -d "false" https://<namespace>.firebaseio.com/.settings/strictTriggerValidation/.json?auth\=<SECRET>
其中<SECRET>
是您的DB secret
请注意,如果您禁用此功能,当前失败的请求可能会通过,但您在超出我们限制的请求上触发的任何云函数都将无法运行。如果您的函数使用数据库触发器,我建议您重新组织您的请求,使其保持在限制范围内。
https://stackoverflow.com/questions/50513374
复制相似问题