【问题标题】:Node.js Socket.io mysql returning duplicatesNode.js Socket.io mysql 返回重复项
【发布时间】:2016-02-18 20:49:00
【问题描述】:

我在使用 socket.io 时遇到了这个问题。每当用户单击链接时,它会转到 mysql,提取数据并将其传递回客户端。我发现当我单击链接 n 次时,我得到 n 个重复项。如果我单击链接 3 次,则返回的数组将重复 3 次。这是我的客户端、服务器端的问题,还是方法本身都错了?

客户端:

 $(document).on("click", "#view_conv", function(event){
      event.preventDefault();
      var data = $("#view_conv").data('id');
      socket.emit("viewing_conv_get_messages", data, uname);
      $("#close_observ_window").show();
      socket.on("show_message", function(htmldata){
          $("#obvs_content").append(htmldata);
      });
  });
  $("#close_observ_window").click(function(event){
    event.preventDefault();
    $("#obvs_content").empty();
  });

服务器端:

client.query("SELECT id FROM conversations WHERE user_one = ? AND user_two = ? AND active = ?", [name_one, name_two, 1],
               function selectCb(err, results){
                  if(err){ throw err; }
                    if(results.length > 0){
                      var convId = "";
                      var str = "";
                      for(var i = 0; i < results.length; i++){
                        convId = str + results[i].id;
                      }
                    client.query("SELECT `message`,`sender` FROM chat_messages WHERE conv_id = ? ORDER BY(id) DESC", convId,
                       function selectCb(err, res){
                          if(err){ throw err; }
                          else {
                            if(res.length > 0){
                            for(var j=0; j<res.length; j++){
                              var string_m = '';
                              var string_send = '';
                              var message = string_m + res[j].message;
                              var sender = string_send + res[j].sender;
                                  content = "<b>" + sender + "</b> : " + message + " <br>";
                                 users[users[users.indexOf(admin)]].emit("show_message", content);
                                 console.log(j);
                            }
                          }
                           // recurse_messages(res, admin, 0);
                        }

                       });
                    }
              });

【问题讨论】:

    标签: javascript mysql node.js sockets socket.io


    【解决方案1】:

    在 click 函数之外编写你的 socket.on 。

    每次单击 #view_conv 时,都会使用当前代码添加一个侦听器。因此,当您点击 3 次时,show_message 事件将有 3 个侦听器。

    尝试像这样修改代码

    客户端:

    $(document).on("click", "#view_conv", function(event){
        event.preventDefault();
        var data = $("#view_conv").data('id');
        socket.emit("viewing_conv_get_messages", data, uname);
        $("#close_observ_window").show();
    });
    
    socket.on("show_message", function(htmldata){
      $("#obvs_content").append(htmldata);
    });
    
    $("#close_observ_window").click(function(event){
    event.preventDefault();
    $("#obvs_content").empty();
    });
    

    您应该始终尝试独立编写侦听器(即,在所有函数之外)

    【讨论】:

    • :) 很高兴我能帮上忙
    猜你喜欢
    • 2013-05-21
    • 2022-12-02
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多