Firebase实时数据库当前提供TRIGGER_PAYLOAD_TOO_LARGE错误

时间:2018-05-24 15:45:02

标签: firebase firebase-realtime-database angularfire2

从今天早上开始,当数据写入Realtime Database实例时,我们的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"

2 个答案:

答案 0 :(得分:8)

好的,我想出来了。该问题与您的写入功能无关,但与写入操作将触发的其中一个云函数无关。

例如,我们有一个像这样的结构: /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.事实上它也发送了前一个值和后一个值,所以如果你(像我们这样)在那一点上有一个TON项目,我猜它尝试发送给云函数的有效载荷太大了。

我从我们的CF和繁荣中删除了计数功能,恢复正常。如果我们根本没有触发器,那么不确定“正确”的计数方法,但是如果我们这样做的话我会更新...

答案 1 :(得分:2)

TRIGGER_PAYLOAD_TOO_LARGE错误是Firebase推出的新功能的一部分,我们的existing RTDB limits正在严格执行。更改的原因是为了确保我们不会默默地删除任何Cloud Functions触发器,因为超出这些限制的任何事件都不能发送到函数。

您可以通过此REST呼叫自行关闭此功能:

curl -X PUT -d "false" https://<namespace>.firebaseio.com/.settings/strictTriggerValidation/.json?auth\=<SECRET>

<SECRET>是您的DB secret

请注意,如果您禁用此功能,则当前失败的请求可能会通过,但您触发的超出我们限制的任何云功能将无法运行。如果您正在为函数使用数据库触发器,我建议您重新构建请求,以使它们保持在限制范围内。