Firebase setDoc创建文档后.then()返回undefined无法获取新条目问题
问题原因
Firebase 模块化SDK(v9及以上版本)中,setDoc() 方法的Promise执行成功后不会返回任何文档相关数据,resolve值固定为undefined,这是API本身的设计,不是代码逻辑错误。
你提到的旧版add()方法,在v9模块化SDK中对应的是addDoc(),这个方法才会在写入成功后返回新创建文档的引用对象。
解决方法
有两种写法可以拿到新创建的条目信息,不需要额外发起读取请求:
方法1:保留现有setDoc写法,提前获取文档引用
调用doc(topicRef)生成文档引用时,如果不手动传入文档ID,SDK会在本地直接生成唯一ID,不需要等待服务端返回,你可以提前把这个引用存下来,写入完成后直接拼接新条目数据更新React状态即可:
const handleSubmitTopic = async () => { const topicRef = collection(db, "topics"); // 提前生成带自动ID的新文档引用 const newTopicDocRef = doc(topicRef); try { await setDoc(newTopicDocRef, { userUID: user.uid, name: topicText, }); // 直接拼接完整的新条目数据 const newTopic = { id: newTopicDocRef.id, userUID: user.uid, name: topicText }; // 更新React主题数组,比如: // setTopics(prevList => [...prevList, newTopic]); } catch (e) { console.log(e); } };
方法2:改用addDoc方法,对齐旧版add()的使用习惯
addDoc是专门用于向集合新增自动ID文档的方法,写入成功后会直接返回新文档的引用,和你之前看到的旧版add()行为完全一致:
const handleSubmitTopic = async () => { const topicRef = collection(db, "topics"); try { const newTopicDocRef = await addDoc(topicRef, { userUID: user.uid, name: topicText, }); // 从返回的引用中取文档ID,拼接新条目 const newTopic = { id: newTopicDocRef.id, userUID: user.uid, name: topicText }; // 更新React主题数组 } catch (e) { console.log(e); } };
注意:两种写法都不需要在写入成功后额外调用查询接口拉取新文档,你写入时传入的字段本身就是确定的,搭配本地生成的文档ID就能直接得到完整的新条目,更新状态的效率更高。
内容的提问来源于stack exchange,提问作者Jose Bernardo
相关产品推荐
相关产品推荐

