Firestore中set()执行后then()回调未触发问题求助
解决Firestore set()后无法获取文档数据的问题
嘿,我来帮你排查这个问题~你的代码里有两个关键问题导致then()里的逻辑没按预期执行,咱们一步步拆解:
核心问题:set()的回调参数不是DocumentSnapshot
Firestore的docRef.set()方法执行成功后,返回的Promise回调参数是WriteResult对象,它只用来记录写入操作的元数据(比如时间戳),但没有get()方法。你原代码里调用docSnap.get()会直接抛出错误,这就是为什么后续逻辑完全没执行(如果没加错误捕获,这个错误会被悄悄吞掉,你根本看不到)。
两种解决方案
根据你的需求,我给你两种可行的写法:
方案1:直接使用已有的数据(推荐,减少一次数据库请求)
如果你没有依赖Firestore服务器端修改数据(比如触发器、规则自动修改字段),那你已经有要写入的data了,完全不需要再去数据库拉取一遍,直接把data放进数组就行:
let agreementData = []; const docRef = headCollectionRef.doc(data.headSlug).collection(recordsCollection) .doc(String(data.recordData.sNo)); docRef.set(data) .then(() => { // 直接用传入的data agreementData.push(data); console.log("数据已写入并添加到数组"); }) .catch(err => { console.error("写入失败:", err); });
方案2:从数据库拉取最新文档数据(适合有服务器端修改的场景)
如果必须确保拿到的是数据库里最终存储的版本(比如有触发器自动补充字段),那就在set()成功后,单独调用docRef.get()来获取文档快照:
const agreementPromises = []; const docRef = headCollectionRef.doc(data.headSlug).collection(recordsCollection) .doc(String(data.recordData.sNo)); // 构建Promise链:先写入,再获取 const operationPromise = docRef.set(data) .then(() => docRef.get()) // 写入成功后,获取文档 .then(docSnap => { if (docSnap.exists) { return docSnap.data(); // 返回文档数据 } else { throw new Error("写入后文档不存在?这不可能啊"); } }) .catch(err => { console.error("操作出错:", err); throw err; // 保留错误,让上层处理 }); agreementPromises.push(operationPromise); // 如果是批量操作,最后用Promise.all等待所有完成 Promise.all(agreementPromises) .then(allData => { agreementData = allData; console.log("所有操作完成,拿到全部数据:", allData); }) .catch(err => { console.error("批量操作失败:", err); });
额外提醒:一定要加错误捕获
你原代码里没有catch(),如果set()本身就失败了(比如权限不足、数据格式错误),你根本看不到错误信息,只会觉得代码“没执行”。所以任何Promise操作都要加上catch()来排查问题。
内容的提问来源于stack exchange,提问作者kt14
相关产品推荐
相关产品推荐

