所以我想防止将具有相同email
字段的文档添加到firestore数据库中。这在身份验证中是自动的,但在firestore中不是。
这是我的基本功能:
const register = async () => {
await addDoc(userCollectionRef, {username: userName, email: newUser, password: registerPassword})
try {
const user = await createUserWithEmailAndPassword(auth, newUser, registerPassword);
console.log(user);
}
catch(e) {
console.log(e.message);
console.log(e.code);
if((e.code) === "auth/email-already-in-use"){
window.alert("Email already registered");
}
}
}
我应该怎么做才能使电子邮件字段成为主键?
Firestore没有主键的概念。最接近的等价物是文档ID。
如果要指定自己的文档ID,请使用带有文档引用的setDoc
,而不是addDoc
:
const userDocRef = doc(userCollectionRef, newUser)
await setDoc(docRef, {username: userName, email: newUser, password: registerPassword})
另请参阅有关编写文档的Firebase文档。
您应该在使用电子邮件和密码创建用户后使用firebase进行编写。
const register = async () => {
try {
const user = await createUserWithEmailAndPassword(auth, newUser, registerPassword).then(() => await addDoc(userCollectionRef, {username: userName, email: newUser, password: registerPassword})) ;
console.log(user);
}
catch(e) {
console.log(e.message);
console.log(e.code);
if((e.code) === "auth/email-already-in-use"){
window.alert("Email already registered");
}
}
}
正如Frank上面提到的,要实现您的目的,您无法使用sdk中的FirebasecreateUser
函数。如果用户已经创建,它将抛出一个错误,并且不会触发将文档写入firebase。