Node.js socket.io为单个事件返回多个值

时间:2017-10-18 21:30:31

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

我正在尝试使用Node,Express(^ 4.15.3)和socket.io(^ 2.0.3)构建一个简单的应用程序。我正在构建一个简单的聊天应用程序,但每次添加新消息时,我每次都会得到一个额外的响应。

例如,如果第一条消息是“Hello”,我将返回:

  1. 你好
  2. 如果我随后添加“有人在吗?”的后续消息,我会回来:

    1. 有人吗?
    2. 有人吗?
    3. 依此类推......每次我得到额外的回复。

      这是我的代码 - 感觉它是非常明显的东西,我可能已经盯着它看了太长时间......

      //app.js
      
      var express          = require("express");
      var bodyParser       = require("body-parser");
      var expressValidator = require('express-validator');
      var session          = require('express-session');
      var passport         = require("passport");
      var app              = express();
      var http             = require('http');
      var server           = http.createServer(app);
      var io               = require('socket.io').listen(server);
      
      app.use(express.static("public"));
      app.set("view engine", "ejs");
      
      server.listen(process.env.PORT || 3000, process.env.IP, function(){
          console.log("Server starting...");
      });
      
      app.get('/testsocket', function(req, res){
         res.render('sockets/test');
      });
      
      io.sockets.on('connection', function(socket){
          console.log('Connected')
          socket.on('send message', function(data){
              console.log('Got the message...');
              io.sockets.emit('new message', data) 
          });
      });
      

      然后是客户端

      //client side
      $(function() {
        var socket = io.connect();
        var $messageForm = $('#send-message');
        var $messageBox = $('#message');
        var $chat = $('#chat');
      
        $messageForm.submit(function(e){
          e.preventDefault();
      
          socket.emit('send message', $messageBox.val());
          $messageBox.val('');
      
          socket.on('new message', function(data){
            $chat.append(data + "<br>");
          });
        });
      });
      

1 个答案:

答案 0 :(得分:2)

我认为问题在于您在提交功能中注册了new message的监听器。因此,每次提交表单时,除了之前的任何侦听器之外,还会注册一个新的侦听器。尝试将socket.on('new message', ...部分放在submit处理程序之外。