Firebase Functions触发时偶发运行旧代码导致新增字段缺失问题
问题成因分析
- 旧函数实例残留:Firebase Functions为了降低冷启动开销,会将启动后的函数实例保留数小时复用。新版本部署完成后,存量的旧版本实例不会被立即销毁,这部分实例处理的触发请求依然会运行不带
archived: false字段的旧逻辑,就会出现字段偶发缺失的现象。通常等待旧实例自然回收后问题就会自动消失,最长不会超过24小时。 - 多触发源冲突:如果存在多个函数绑定了同一个
/jobs/{id}的更新触发器,或者你给当前函数配置了多区域部署,就可能出现新旧版本函数同时被触发的情况,旧版本函数写入的文档自然不会带有archived字段。 - 同文档写入覆盖:如果除了该函数外,还有其他业务逻辑(客户端写入、其他云函数、后台手动操作)会对相同的
rooms文档执行写入,且写入时未携带archived字段、也未开启merge: true的增量写入配置,就会在该函数写入完成后,覆盖掉archived字段。 - 部署流程异常:如果上次部署过程中出现了网络中断、权限报错等异常,可能出现部分实例更新为新版本、部分仍保留旧版本的情况,可以重新执行一次完整的部署操作,确认部署无报错后再验证。
排查建议
你可以在函数的set操作前增加一行日志输出,例如console.log('写入archived字段', false),之后在Firebase控制台的函数日志页面查看,缺失archived字段的写入请求对应的日志是否存在,即可快速确认是否为旧实例运行旧代码导致的问题。
内容的提问来源于stack exchange,提问作者Dijiflex
相关产品推荐
相关产品推荐

