Firebase实时数据库用户ID存为undefined及数据覆盖问题求助
问题解决:Firebase实时数据库用户节点显示undefined并被覆盖
核心问题分析
你的代码存在两个关键错误:
- Firebase Auth用户的唯一标识属性是
uid,而非id,所以user.id会返回undefined,导致所有用户数据被写入user/undefined节点,每次创建新用户都会覆盖该节点内容。 createUserWithEmailAndPassword方法仅接受auth实例、邮箱、密码三个参数,你额外传入的schoolID属于无效参数,不会被处理。
修正后的代码
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.13.0/firebase-app.js"; import { getDatabase, set, ref } from "https://www.gstatic.com/firebasejs/9.13.0/firebase-database.js"; import { getAuth, createUserWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.13.0/firebase-auth.js"; // 替换为你的Firebase项目配置 const firebaseConfig = { apiKey: "YOUR_API_KEY", authDomain: "YOUR_AUTH_DOMAIN", databaseURL: "YOUR_DATABASE_URL", projectId: "YOUR_PROJECT_ID", storageBucket: "YOUR_STORAGE_BUCKET", messagingSenderId: "YOUR_MESSAGING_SENDER_ID", appId: "YOUR_APP_ID" }; // 初始化Firebase服务 const app = initializeApp(firebaseConfig); const auth = getAuth(app); const database = getDatabase(app); // 注册逻辑 signup.addEventListener('click',(e) => { e.preventDefault(); // 阻止表单默认提交,避免页面刷新 var username = document.getElementById('signup-user').value; var email = document.getElementById('signup-email').value; var schoolID = document.getElementById('signup-id').value; var password = document.getElementById('signup-pwd').value; createUserWithEmailAndPassword(auth, email, password) .then((userCredential) => { const user = userCredential.user; // 使用用户uid作为节点名称,写入用户数据 set(ref(database, `user/${user.uid}`), { username: username, schoolID: schoolID, email: email }) .then(() => { alert('用户创建成功!'); }) .catch((dbError) => { alert('写入数据库失败:' + dbError.message); }); }) .catch((error) => { alert('注册失败:' + error.message); }); });
额外优化提示
- 添加
e.preventDefault()避免表单默认提交导致的页面刷新,保证注册流程完整执行。 - 为数据库写入操作单独添加错误捕获,可更精准定位数据存储环节的问题。
- 使用模板字符串
user/${user.uid}拼接路径,比字符串拼接更清晰易读。
内容的提问来源于stack exchange,提问作者shemjay
相关产品推荐
相关产品推荐

