2016-10-30 18 views
0

私はカスタムfirebase認証方法を作っていますが、これまではユーザー情報を収集してsocket.ioでサーバーに送信した後、検証がうまくいけばfirebase。これは私がこれまでに得たものであるが、私はfirebaseに挿入を開始するとき、console.log()は複数回firebase試行が必要以上に挿入することを意味呼び出さ:Firebaseの.on()メソッドが複数回起動される

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回ではなく1回だけ使用することです。

これは私のconsole.logsの様子です。

BIG UPDATE:この問題は、挿入が開始されたときにのみ発生します。すでにユーザー名とメールアドレスが同じ場合、再設定されません。タイ!

答えて

5

ONの代わりにのONCEメソッドを使用する必要があります。毎回socket.on(それがコールバックを登録すると呼ばれて "登録" ため

第一レジスターUSER = 1コールバック

第二のレジスタのユーザ= 2のコールバック(1日から新しいコールバック+古いコールバック) = 3コールバック(1 + 2日から新しいコールバック+古いコールバック)

第三レジスタユーザーはのはとてもメートルありがとう

+0

を試してみましょうuch!それは最高です!私にチップを与えることができれば、socket.ioを使って登録方法としては良いですか?私は多くの人がbodyParserとpostメソッドを使っているのを見ました。 –

関連する問題