首页 > 解决方案 > 为什么带有socket.io的nodejs服务器会导致连接无限循环?

问题描述

我们是一个由 2 名开发人员组成的小组,他们试图用 node js 和 socket.io 实现一个简单的聊天服务器。我们正在使用 github。当我拉动我的合作伙伴更改并启动 npm 时,我发现我的控制台在无限循环中输出“用户已连接” 。

这是代码(用于输出连接一次的用户的部分:socket.on('user login', function(newuser)...)。 index.js

//dependencies
var app = require('express')();
var http = require('http').Server(app); //http server
//initialize a new instance of socket.io by passing http server
var io = require('socket.io')(http);
var users = []; //List of online users
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');

  socket.on('disconnect', function(){
    console.log('user: '+socket.username + ' logged out.');
    var date = new Date();
    io.emit('info message', {timestamp: date.toUTCString(), user: socket.username + ' logged out.'});
    //TO DO: Delete user from list.
  });

...

index.html脚本:

<script src="https://cdn.socket.io/socket.io-2.1.1.js"></script>


<script>

$(function () {
          var socket = io();

          /*
          * On submit of form with id 'entername' client sends entered username to server.
          * After sending div-Container loginDiv will be hidden and messageDiv will be shown.
          * And last: set value of usernameinput to ''.
          * */
          $('#enterName').submit(function () {
             //console.log($('#userNameInput').val());
             socket.emit('user login',$('#userNameInput').val());
             $('#loginDiv').hide();
             $('#messageDiv').show();
             $('#userNameInput').val('');
             return false;
          });
});
</script>

package.json依赖:

"dependencies": {
    "body-parser": "^1.18.3",
    "express": "^4.16.3",
    "socket.io": "^2.1.1"
  }

标签: javascriptnode.jsnpmsocket.io

解决方案


正如我所怀疑的,我必须在客户端和服务器端使用相同的 socket.io 版本。因此,我再次安装了socket.io(服务器端),取了版本(在依赖项下的package.json中找到)并在此处搜索https://cdnjs.com/libraries/socket.io/以获取要绑定的脚本src到我的 html 中,以便将其加载到客户端。在我的情况下更新了 index.html 脚本源:

  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>

之前,我只是将版本号更改为 src,而没有搜索正确的 url。


推荐阅读