Firebase v9注册后如何以自定义文档名将用户存入Firestore数据库
报错原因
你用错了Firestore的写入API:addDoc()的作用是往集合里新增文档、自动生成随机文档ID,它只接受2个参数:集合引用、待写入的纯对象。你额外传入的uid字符串被它识别成了待写入数据,自然触发「数据必须是对象」的报错。
正确实现方案
要自定义文档ID(也就是你说的自定义文档名),不能用addDoc(),需要两步走:
- 用
doc()方法,显式指定「所属数据库、所属集合、自定义文档ID」,拿到目标文档的引用 - 调用
setDoc()往这个指定的文档里写入数据
另外注意:绝对不要在自己的数据库里存明文密码,Firebase Auth已经安全存储了用户的认证凭证,存明文密码是严重的安全漏洞。
修正后的可运行代码如下:
// 先补全缺失的方法引入,路径替换成你项目里的实际路径 import { createUserWithEmailAndPassword } from "firebase/auth"; import { doc, setDoc } from "firebase/firestore"; import { auth, db } from "./your-firebase-config"; function signUp(email, password) { return createUserWithEmailAndPassword(auth, email, password).then(async (userCred) => { // 从注册接口返回的凭证里取uid,比读auth.currentUser更稳定,避免时序问题 const uid = userCred.user.uid; // 指向users集合下、ID对应当前用户uid的文档 const userDocRef = doc(db, "users", uid); // 写入用户数据,已经移除了明文密码字段 await setDoc(userDocRef, { email: email, uid: uid, role: "user" }); }); }
额外注意事项
- 写入操作记得加
await或者链式返回Promise,不然你没法捕获写入失败的错误,也没法保证注册流程走完时数据已经存好 - 后续如果要更新用户信息,还是用
doc(db, "users", uid)拿到文档引用,调用updateDoc()做局部更新即可 - 可以给users集合加安全规则,限制用户只能读写自己uid对应的文档,避免越权访问
内容的提问来源于stack exchange,提问作者ahmedskulj10
相关产品推荐
相关产品推荐

