【发布时间】:2016-10-31 04:26:31
【问题描述】:
我正在制作一个自定义的 firebase 身份验证方法,到目前为止,我设法制作了一个表单,用于收集用户信息并将它们与 socket.io 一起发送到服务器,然后如果验证正常,则发送到 firebase。这是我到目前为止所得到的,但是当我开始插入 firebase 时,console.log() 会被多次调用,这意味着 firebase 会尝试插入超出需要的内容:
io.on("connection", socket => {
socket.on("register", user => {
console.log("Register") //gets called once, this is good!
let db = firebase.database();
let usersRef = db.ref("users").child(user.username);
firebase.database().ref("users").on("value", data => { //here we read from DB
console.log('Firebase begins here!') //this gets loged multiple times
let isValid = true; //simple var to check if validation is true/false
for (var el in data.val()) { //here we take user informations
if(data.val()[el]["name"]==user.username) { // check if username exists
console.log("Username already takken!") //gets fired more time
socket.emit("username")
isValid = false;
break;
}
if(data.val()[el]["email"]==user.email) {
console.log("Email is already takken!") //same story
socket.emit("email")
isValid = false;
break;
}
} //end of for in loop
console.log(isValid);
if(isValid) {
usersRef.set({
name: user.username,
email:user.email,
password: user.password,
balance: 0
})
}
} , errorObject => {console.log("The read failed: " + errorObject.code)})});});
好的部分是isValid 变量防止插入多次,因为在第一次插入后isValid 更改为false,它不会插入数据。无论如何,这不是我真正想要的,理想的情况是只使用 .on() 方法 1 次,而不是 5-6 次..
这就是我的 console.logs 的样子:
Register event!
Firebase begins here!
true
Firebase begins here!
Username already takken!
false
Register event!
Firebase begins here!
Username already takken!
false
Register event!
Firebase begins here!
Username already takken!
false
Register event!
Firebase begins here!
true
Firebase begins here!
Username already takken!
false
Firebase begins here!
Username already takken!
false
Firebase begins here!
Username already takken!
false
Firebase begins here!
Username already takken!
false
重大更新:该问题仅在插入开始时发生,如果已经有相同的用户名/电子邮件,则不会重复。太棒了!
【问题讨论】:
标签: javascript node.js firebase firebase-realtime-database