繁体   English   中英

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

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

我正在制作一个自定义的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

大更新:仅当插入开始时才会发生此问题,如果已经有相同的用户名/电子邮件,则该用户名不会重复出现。

您应该使用ONCE方法而不是ON。

因为每次调用socket.on(“ register”都会注册回调。

第一个注册用户= 1个回调

第二个注册用户= 2个回调(新回调+从第一个开始的旧回调)

第3个注册用户= 3个回调(新回调+旧回调从第一个+第二个)

我们试试吧

暂无
暂无

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

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