从Firebase实时数据库匹配登录用户UID获取firstName失败求助
问题解决:Firebase Realtime Database无法获取匹配用户的firstName
核心问题有两个:一是你的数据库中users的子节点键为自动生成的Push ID(如-NuU3rpSGUXRSwQKrCJC),而非用户uid,直接通过users/${uid}访问路径会找不到数据;二是异步函数未正确返回Promise,导致await无法拿到有效结果。
修复方案
方案1:通过查询筛选匹配的用户记录
针对当前数据库结构,使用orderByChild和equalTo查询userId字段等于当前用户uid的记录:
// 监听认证状态变化 onAuthStateChanged(auth, async (user) => { if (user) { const firstname = await getFirstnameOfLoggedInUser(); welcomeTxt.textContent = firstname ? `Welcome back, ${firstname}!` : "Welcome back!"; } else { console.log("user is logged out"); welcomeTxt.textContent = "Welcome! Please sign in or create an account."; } }); // 获取登录用户的firstName async function getFirstnameOfLoggedInUser() { const user = auth.currentUser; if (!user) return null; const uid = user.uid; // 创建查询:筛选userId与当前用户uid匹配的记录 const usersRef = ref(database, "users"); const query = orderByChild(usersRef, "userId").equalTo(uid); try { const snapshot = await get(query); if (snapshot.exists()) { // userId应唯一,取第一个匹配记录的firstName const userData = Object.values(snapshot.val())[0]; return userData.firstName; } else { console.log("未找到匹配的用户记录"); return null; } } catch (error) { console.error("获取用户数据失败:", error); return null; } }
方案2:优化数据库结构(更高效)
如果业务允许,建议创建用户记录时直接用用户uid作为users的子节点键,这样无需查询即可直接访问数据:
创建用户时的代码示例:
// 用用户uid作为节点键 const userRef = ref(database, `users/${user.uid}`); set(userRef, { company: "CkCo", email: "email@email.com", firstName: "Frank", lastName: "Rizzo" // 可省略userId字段,因为节点键已等于uid });
优化后的获取数据代码:
async function getFirstnameOfLoggedInUser() { const user = auth.currentUser; if (!user) return null; const uid = user.uid; const userRef = ref(database, `users/${uid}`); try { const snapshot = await get(userRef); return snapshot.exists() ? snapshot.val().firstName : null; } catch (error) { console.error(error); return null; } }
内容的提问来源于stack exchange,提问作者Luke Glover
相关产品推荐
相关产品推荐

