首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Firebase实时数据库当前显示TRIGGER_PAYLOAD_TOO_LARGE错误

Firebase实时数据库当前显示TRIGGER_PAYLOAD_TOO_LARGE错误
EN

Stack Overflow用户
提问于 2018-05-24 23:45:02
回答 2查看 4.3K关注 0票数 13

从今天早上开始,我们的Firebase应用程序在将数据写入Realtime Database实例时出现了问题。即使是最简单的任务,比如向对象添加一个键值对,也会触发

Error: TRIGGER_PAYLOAD_TOO_LARGE: This request would cause a function payload exceeding the maximum size allowed.

这特别奇怪,因为我们的代码或数据库在超过24小时内没有任何变化。

即使是像这样简单的事情

代码语言:javascript
复制
Database.ref('environments/' + envkey).child('orders/' + orderkey).ref.set({a:1})

触发错误。

显然,有效负载的大小不是问题,但是是什么导致了这种情况呢?

数据库结构,根据要求

代码语言:javascript
复制
 `environments     +-env1     +-env2     --+orders     ---+223344     -----customer: "Peters"     -----country: "NL"     -----+items     ------item1     -------code: "a"     -------value: "b"     ------item2     -------code: "x"     -------value: "2"`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-25 14:26:46

好了,我想通了。该问题与您的写入函数无关,而是与写入操作将触发的云函数之一有关。

例如,我们在JSON中有一个类似:/collections/data/abcd/items/a的结构:

代码语言:javascript
复制
"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,甚至是控制台中的基本编写。

我决定查看我们的云函数,并发现了以下内容:

代码语言: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中删除了计数函数,恢复到正常状态。如果我们根本没有触发器,我不确定计数的“正确”方式,但如果我们有触发器,我会更新这个……

票数 11
EN

Stack Overflow用户

发布于 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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50513374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档