Firebase web v9 事务无报错执行完成却返回null值问题求助
排查解决思路
- 首先确认服务端实际数据状态
在你现有代码的console.log("3", returnVal.snapshot.toJSON());之后新增一行查询逻辑,确认数据实际写入结果:const freshSnapshot = await get(firebaseRef); console.log("服务端最新数据", freshSnapshot.toJSON());- 如果这里输出的是符合预期的
{otherMeta: {...}, ready: true},说明是SDK事务返回快照的已知异常,你可以直接升级Firebase Web SDK到v9最新版修复,或者暂时绕过该问题:不使用事务返回的snapshot,事务提交后主动调用get()获取最新值即可。 - 如果这里输出也是null,说明写入未生效或写入后被清除,继续往下排查。
- 如果这里输出的是符合预期的
- 检查并行操作与生命周期逻辑
确认是否存在其他并行的写入逻辑(同路径的set/remove操作、提前触发的onDisconnect删除逻辑),在事务提交的同时清空了该路径的数据。 - 调整事务更新函数的null处理逻辑
Firebase事务首次执行时会优先读取本地缓存,无缓存时就会返回null,你当前的代码在首次拿到null时直接返回null,虽然会触发服务端校验重试,但是可以调整逻辑避免不必要的空值返回:const returnVal = await runTransaction(firebaseRef, async node => { // 本地缓存为空时中止本次事务,外层可捕获后重试整个事务 if (!node) return undefined; if (node.ready != true) { node.ready = true; } return node; }); - 检查权限与运行环境
- 确认该路径的数据库安全规则,你当前的认证身份拥有该路径的读写权限。
- 如果你使用的是Firebase本地模拟器,重启模拟器后再重试,部分模拟器版本存在事务返回值异常的问题。
- 确认更新函数无遗漏的异步操作
如果你的实际业务代码中更新函数内存在其他异步逻辑,确保所有异步操作都正确添加await等待完成后再返回修改后的节点值。
内容的提问来源于stack exchange,提问作者Blaine
相关产品推荐
相关产品推荐

