簡體   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