简体   繁体   English

Firebase .on()方法被多次触发

[英]Firebase .on() method gets fired more than once

I'm making a custom firebase authentification method, so far I managed to make a form that collects users informations and send them with socket.io to the server and after that to the firebase if validation is fine. 我正在制作一个自定义的Firebase身份验证方法,到目前为止,我设法制作了一种收集用户信息的表单,并将其与socket.io一起发送到服务器,然后如果可以的话,将其发送到Firebase。 This is what I got so far, but when I start inserting in the firebase, the console.log() gets called more than once meaning that firebase tries to insert more than needed: 到目前为止,这就是我得到的结果,但是当我开始在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)})});});

The good part is that the isValid variable prevent insertion multiple times because after the first insertion isValid changes to false and it won't insert the datas. 好的方面是, isValid变量可防止多次插入,因为在第一次插入后, isValid更改为false,并且不会插入数据。 Anyway, this is not what I'm really looking for, the ideal is to use the .on() method only 1 time, not 5-6 times.. 无论如何,这不是我真正想要的,理想的情况是只使用.on()方法1次,而不是5-6次。

This is how my console.logs look like: 这是我的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

BIG UPDATE: The issue happens only when insertions starts, if there's already a username/email the same, it won't reapeat. 大更新:仅当插入开始时才会发生此问题,如果已经有相同的用户名/电子邮件,则该用户名不会重复出现。 Ty!

You should use ONCE method instead of ON. 您应该使用ONCE方法而不是ON。

Because every time socket.on("register" is called it register callback. 因为每次调用socket.on(“ register”都会注册回调。

1st register user = 1 callback 第一个注册用户= 1个回调

2nd register user = 2 callback ( new callback + old callback from 1st) 第二个注册用户= 2个回调(新回调+从第一个开始的旧回调)

3rd register user = 3 callback ( new callback + old callback from 1st + 2nd) 第3个注册用户= 3个回调(新回调+旧回调从第一个+第二个)

let's try 我们试试吧

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM