从今天早上开始,我们的 Firebase 应用程序在将数据写入实时数据库实例时出现问题。即使是最简单的任务,例如将一个键值对添加到对象触发器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"
最佳答案
好的,我想通了。该问题与您的写入功能无关,而是与写入操作将触发的云功能之一有关。
例如,我们有这样的结构:/collections/data/abcd/items/a
在 JSON 中:
"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 和繁荣中删除了计数功能,恢复正常。如果我们根本没有触发器,不确定进行计数的“正确”方法,但如果我们这样做,我会更新它......
关于Firebase 实时数据库当前给出 TRIGGER_PAYLOAD_TOO_LARGE 错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50513374/