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

时间:2016-10-30 16:28:42

标签: javascript node.js firebase firebase-realtime-database

我正在制作一个自定义的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()方法一次,而不是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

BIG UPDATE:只有在插入开始时才会出现问题,如果已经有相同的用户名/电子邮件,则不会重新插入。 TY!

1 个答案:

答案 0 :(得分:5)

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

因为每次socket.on(“寄存器”被调用它都会注册回调。

第一个注册用户= 1回调

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

第3次注册用户= 3回调(新回调+第1次和第2次的旧回调)

让我们试试