You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:57:37