此Google Cloud Function的Firestore触发器是否会引发无限循环?
问题解答
1. 无限循环判断是否正确
你的判断完全正确,这段代码确实会触发无限循环。
Firestore的onWrite触发器会监听指定文档的所有写入操作,包括创建、更新、删除三种场景。你在函数内部调用了change.after.ref.update(),属于对当前监听文档的写入操作,会直接再次触发onUserWrite函数:
- 第一次触发:外部写入文档触发函数执行
- 函数运行到
update语句,写入同一份监听路径的文档 - 触发第二次
onWrite事件 - 重复上述流程,直到Cloud Function调用次数达到配额上限后报错停止
2. 官方文档未单独提及该注意事项的原因
这属于触发器的基础逻辑范畴,官方文档已经明确说明onWrite触发器的触发时机是监听路径的所有写入操作,没有单独把自触发场景拎出来说明,主要有两个原因:
- 该逻辑是触发器设计的原生特性,并非bug或者未声明的隐藏逻辑,属于开发者需要自行掌握的基础使用规则
- 实际业务场景中更新逻辑的判断条件千差万别,官方无法枚举所有不规范用法,只会明确给出通用最佳实践:所有写入触发的函数如果需要修改触发源文档,必须先对比变更前后的字段值,避免重复触发。
3. 修复方案参考
你可以在函数开头增加字段变更判断,只有当需要更新的字段不符合预期时才执行写入操作,即可避免无限循环:
export const onUserWrite = functions.firestore.document('/path/path').onWrite(async (change) => { if (!change.after.exists) { return; } const afterData = change.after.data(); // 只有当somedata不等于预期值时才执行更新 if (afterData?.somedata === 'data') { return; } await change.after.ref.update({somedata:'data'}); return true; });
内容的提问来源于stack exchange,提问作者GeorgeMenezes
相关产品推荐
相关产品推荐

