Firebase 错误:TOO_MANY_TRIGGERS
Posted
技术标签:
【中文标题】Firebase 错误:TOO_MANY_TRIGGERS【英文标题】:Firebase error: TOO_MANY_TRIGGERS 【发布时间】:2018-11-12 12:39:18 【问题描述】:在我们的 Firebase 应用程序中,有一个列表,其中包含实时数据库中的大量项目。 Firebase Cloud Function 使用 onWrite 触发器处理单个项目的每个创建、更新和删除操作(在最简单的情况下,此函数只计算项目)。但有时需要对物品进行批量操作,而不需要单独处理。假设我们希望在单个事务中删除所有项目并重置计数器。
之前它工作得很好。由于单次写入 (https://firebase.google.com/docs/database/usage/limits) 触发的 Cloud Functions 数量限制为 1000,因此根本没有触发任何功能,这是理想的结果。
现在,我们没有对应用程序代码进行任何更改,但出现了错误
错误:TOO_MANY_TRIGGERS:此请求会导致触发太多函数。
客户端应用程序、管理 API 甚至使用 Web 界面导入 json 时也会出现同样的错误。唯一对我们有用的选项是批量处理项目。但它不是事务性的,最多需要几十分钟而不是以前的毫秒。
我们有哪些选项可以绕过这个错误?最好是在超过限制的情况下跳过功能触发的一些开关。
【问题讨论】:
我遇到了类似的问题。不幸的是,Firebase 有其局限性。 我分批删除了1000多条记录,每批只删除500条记录。 【参考方案1】:目前没有办法阻止触发器在特殊情况下运行。解决此问题的唯一方法是取消部署所有触发器,执行更新,然后再次部署所有触发器。
为此,我鼓励您file a feature request。
【讨论】:
不幸的是,取消部署和部署触发器不适用于我们的案例,因为在此过程中可能会留下未处理的新数据。 我明白了。这是您目前唯一的选择。 @DougStevenson 为什么删除具有超过 1000 个子节点的单个节点被视为多个触发器?我们只删除一个节点,不应该只是一个触发器吗? 如果您有一个带有 .write 操作触发器的云函数,也会调用太多触发器。如果您只使用 .update(例如在导入新数据时),这可能是一种解决方法。但我同意,棘手【参考方案2】:对于 2018 年后阅读此问题的任何人,现在可以选择禁用对触发限制的严格执行。
对于触发事件的写入操作,默认启用严格验证。任何触发超过 1000 个 Cloud Functions 或单个事件大小超过 1 MB 的写入操作都将失败并返回一个错误,报告已达到的限制。这可能意味着如果预验证失败,某些 Cloud Functions 根本不会被触发。
如果您正在执行更大的写入操作(例如,删除整个数据库),您可能希望禁用此验证,因为错误本身可能会阻止操作。
要关闭 strictTriggerValidation,请按以下步骤操作:
从 Firebase 控制台中项目设置的服务帐户选项卡获取您的数据库密钥。 从命令行运行以下 CURL 请求:curl -X PUT -d "false" https://NAMESPACE.firebaseio.com/.settings/strictTriggerValidation/.json?auth\=SECRET
请参阅此处查看文档:https://firebase.google.com/docs/database/usage/limits
【讨论】:
这非常有用,谢谢。应该设置为正确答案。【参考方案3】:我刚刚在很久没有接触过的较旧的 Flutter 项目中收到此错误消息。
[firebase_database/unknown] TOO_MANY_TRIGGERS:这个请求会导致太多的函数被 触发。
原来,这是因为我的 Cloud Functions 仍然设置为使用 Node v8,它已于 2021 年初退役。
升级 Cloud Functions 以使用 Node v12(无需其他更改)为我删除了错误消息。
【讨论】:
以上是关于Firebase 错误:TOO_MANY_TRIGGERS的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 核心依赖错误(Flutter/Firebase)
尝试导入错误:“initializeApp”未从“firebase”导出(导入为“firebase”)[关闭]
Firebase 错误:未创建 Firebase 应用默认值