我正在尝试更新Firebase中当前登录用户的电子邮件详细信息,它运行正常,但我想知道是否有更好的方法来检测重复的电子邮件错误。
我想我有两个选择:
或
我认为第二种方法会更有效率,因为大多数用户不会输入重复的电子邮件,因此每次运行此检查似乎毫无意义。但是,在第二种方法中处理重复电子邮件检测的正确方法是什么?
这是我目前的代码:
function submitEmail(){
var requesteduseremail = "myemail@email.com";
var currentuser = firebase.auth().currentUser;
currentuser.updateEmail(requesteduseremail).then(function() {
console.log("Email should now be entered into the Firebase console.");
}, function(error) {
console.log("Something went wrong: "+error);
if(error == "Error: The email address is already in use by another account."){
console.log("That email is already registered... so handle it here.");
}
});
}
此代码工作正常,我可以向用户显示一条消息,通知他们电子邮件已经注册。但由于我使用Firebase错误文本"Error: The email address is already in use by another account."
来检测此错误,因此如果Firebase更改错误消息,它将会中断。是否可能使用我可以使用的数字错误代码? Firebase在未来不太容易被改变的东西?
感谢您的帮助。
更新
目前检查电子邮件是否已存在的尝试:
var useremail = testemail1@email.com;
firebase.database().ref().child("active_emails").orderByChild("email").equalTo(useremail).once("value", function(snapshot) {
var emailSnapshot = snapshot.val();
if (emailSnapshot){
console.log("Sorry, that email already exists");
}else{
console.log("Email doesn't already exist, can now run function to create the account.");
}
});
即使我尝试使用已在Firebase应用中注册的电子邮件,也一直说电子邮件不存在。我想我可能会错误地引用数据。
这是我的数据库的布局:
MYAPP
|_______chat
|
|_______users
| |_____userA
| | |______email
| | |______first_name
| | |______last_name
| |
| |_____userB
|
|_______active_emails
|_______"email":"testemail1@email.com"
|_______"email":"testemail2@email.com"
所以我正在尝试查看useremail
active_emails
我认为错误在firebase.database().ref().child("active_emails").orderByChild("email").equalTo(useremail).once("value", function(snapshot){
行,但我无法弄明白。
对此的任何帮助都将非常感谢,再次感谢!
更新2
我目前的尝试:
firebase.database().ref('/active_emails/').equalTo(useremail).once("value", function(snapshot) {
var emailSnapshot = snapshot.val();
if(emailSnapshot){
console.log("Email exists.");
}else{
console.log("Email doesn't exist.");
}
答案 0 :(得分:1)
在第一个选项中,首先检查是否存在电子邮件地址,然后插入新的电子邮件地址。这有一个竞争条件:
User A User B Server
| |
+ does a@b.com exist?--------------------------->
| |
| + does a@b.com exist?->
| |
+<- no ------------------------------------------
| |
| +<- no ----------------
| |
+ create a@b.com ------------------------------->
| |
| + create a@b.com ----->
| |
在这种情况下,您仍会收到第二个用户的错误消息,这是您的第二个选择。
这就是为什么你必须始终处理服务器端的情况并检查错误。如果您有时间,您还可以实施初始客户端检查,以提前警告您的用户重复。
例如,您可以在用户输入时实施此早期检查,并在检测到情况后立即显示“此电子邮件地址已在使用中”。但是,当用户提交其电子邮件地址时,您必须始终检查重复项,从而处理错误。
为了处理错误,您确实不应该依赖于消息字符串。返回的错误是JSON对象:
{
code: "auth/email-already-in-use",
message: "The email address is already in use by another account."
}
所以你可以查看代码。请参阅reference documentation for updateEmail
以获取可能的错误代码列表。