【问题标题】:Firebase .on() method gets fired more than onceFirebase .on() 方法被多次触发
【发布时间】:2016-10-31 04:26:31
【问题描述】:

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

重大更新:该问题仅在插入开始时发生,如果已经有相同的用户名/电子邮件,则不会重复。太棒了!

【问题讨论】:

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


    【解决方案1】:

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

    因为每次 socket.on("register" 被称为注册回调。

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

    第二个注册用户 = 2 个回调(新回调 + 来自第一个的旧回调)

    第 3 个注册用户 = 3 个回调(新回调 + 来自第 1 个的旧回调 + 第 2 个)

    我们试试

    【讨论】:

    • 非常感谢!那很完美!如果你能给我一个小费,使用socket.io作为注册方法好吗?我见过很多人使用 bodyParser 和 post 方法..
    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 2019-06-24
    • 2021-03-21
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多