写入同一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
相关产品推荐
相关产品推荐

