Firestore .data()返回undefined问题求助
问题分析与解决方案
核心问题
你遇到的doc.data()返回undefined,本质是Firestore文档要么不存在,要么你查询的UID与实际存储的文档ID不匹配,根源出在用户创建流程的时序和后端路由逻辑上。
第一步:修复后端路由逻辑
你之前在post接口回调里动态注册get路由的做法完全错误,会导致路由重复注册、返回旧用户数据的问题。直接在post接口返回创建好的Firebase用户记录即可:
app.post('/api/user', jsonParser, (req, res) => { const user = req.body; getAuth() .createUser({ email: user.email, password: user.password, displayName: user.name, }) .then((UserRecord) => { console.log(UserRecord); // 直接把用户记录返回给前端,不需要额外的info接口 res.status(200).json(UserRecord); }) .catch((err) => { console.log(err); res.status(500).json({ error: err.message }); }); });
删除之前动态添加的/api/user/info路由,彻底避免路由冲突。
第二步:修复前端创建用户的时序问题
你之前的axios.post和axios.get是并行执行的,完全没等用户创建完成就去拿UID,大概率拿到的是旧数据或者空值,导致Firestore文档ID错误。改用async/await保证时序:
async function createUser(email, password, name, rol) { try { // 等待用户创建请求完成,拿到正确的用户UID const res = await axios.post('http://localhost:5000/api/user', { email, password, name, rol, }); const userRecord = res.data; // 用返回的正确UID创建Firestore文档 const docRef = doc(db, `users/${userRecord.uid}`); await setDoc(docRef, { email, name, rol }); console.log('用户创建并存储成功'); } catch (err) { console.error('创建用户失败:', err); } }
第三步:完善前端获取数据的逻辑
给getUserData加上文档存在判断,明确问题所在,避免data()返回undefined的模糊情况:
async function getUserData(uid) { const docRef = doc(db, `users/${uid}`); const docSnap = await getDoc(docRef); console.log(docSnap); // 先判断文档是否存在 if (docSnap.exists()) { const data = docSnap.data(); console.log('用户数据:', data); return data; } else { console.error(`UID为${uid}的用户文档不存在`); return null; } }
问题根源总结
- 时序错误:并行发起
post和get请求,导致用错误的UID创建Firestore文档,后续查询时找不到对应数据。 - 后端路由设计错误:动态注册路由会导致重复路由,返回旧的用户数据。
- 缺少存在性判断:直接调用
data()而不检查文档是否存在,导致返回undefined时无法定位问题。
内容的提问来源于stack exchange,提问作者Andrés Marino
相关产品推荐
相关产品推荐

