You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

写入同一Firestore文档的云函数是否会触发自身陷入死循环?

问题结论

这段逻辑会直接触发云函数无限死循环。

原因说明
  • 你使用的onWrite触发器会监听指定文档的所有写入类操作,包含创建、更新、删除三种场景,只要文档发生写入就会触发函数执行。
  • 现有逻辑的过滤条件if (!change.after.data()) return只能过滤文档删除的场景,只要文档存在就会执行后续的set操作,对同一文档的count字段做更新。
  • 该set操作本身就是一次新的文档写入行为,会再次触发onWrite触发器,进入「触发→更新count→触发→更新count」的无限循环。
  • 补充说明:你提供的代码中t.set属于未定义变量的笔误,实际执行时如果没有声明t变量会先抛出报错,报错后不会执行写入操作,这种异常场景下不会触发循环,但修复笔误后必然会出现死循环问题。
修复方案

你可以通过对比写入前后count字段的变化,过滤掉函数自身触发的写入事件即可:

export const testFunction = functions.firestore
  .document('posts/{postID}')
  .onWrite((change) => {
      // 文档被删除直接返回
      if (!change.after.data()) return;

      const beforeCount = change.before.data()?.count ?? 0;
      const currentCount = change.after.data().count ?? 0;
      // 如果当前count正好是之前值+1,说明是上一次函数执行更新的,直接返回避免循环
      if (currentCount === beforeCount + 1) return;
      
      return change.after.ref.set({ count: currentCount + 1 }, { merge: true });
  });

内容的提问来源于stack exchange,提问作者Thomas D Cat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:03