Node.js 当新用户连接时,上一个连接将成为新用户

Node.js 当新用户连接时,上一个连接将成为新用户,node.js,socket.io,Node.js,Socket.io,我一直在玩NodeJS和socket.IO,我来自PHP开发,试图真正理解如何使用Node和socket.IO 我开始构建一个聊天应用程序,当我在不同的设备上测试它时,我注意到,例如,当我通过手机登录到另一个帐户时,浏览器窗口会更新,并获得与我登录手机时相同的用户 index.html <!DOCTYPE html> <html> <head> <title>Socket.IO chat</title> <st

我一直在玩NodeJS和socket.IO,我来自PHP开发,试图真正理解如何使用Node和socket.IO

我开始构建一个聊天应用程序,当我在不同的设备上测试它时,我注意到,例如,当我通过手机登录到另一个帐户时,浏览器窗口会更新,并获得与我登录手机时相同的用户

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: 0.5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
  </head>
  <body>
    <div id="chatLogin">
        <input type="text" name="password" id="username" placeholder="Username..." /><br>
        <input type="password" name="password" id="password" placeholder="Password..." /><br>
        <button id="chatLoginBtn">Login / Register</button>
    </div>
    <div id="chatWindow">
        <ul id="messages"></ul>
        <form action="">
            <input id="m" autocomplete="off" /><button>Send</button>
        </form>
    </div>
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(function () {
    var socket = io();
    $(document).ready(function(){
    $("#chatWindow").hide();
        $("#chatLoginBtn").click(function(){
            socket.emit('loginForm', {
                username: $("#username").val(),
                password: $("#password").val()
            });
        });

    });





    socket.on('returnValue', function(msg) {
            var html = '<ul id="messages"></ul>' + 
            '<form id="sendMsg" action="">' + 
            '<input id="m" autocomplete="off" /><button>Send</button>' + 
            '</form>';
            $("#chatLogin").html("").hide();
            $("#chatWindow").html(html).show();

              $('#sendMsg').submit(function(e) {
                e.preventDefault(); // prevents page reloading
                var time = Date.now();
                var msg = $("#m").val();
                var data = [time, msg];
                socket.emit('chat', data);
                $('#m').val('');
                return false;
            });
        });

    socket.on('chat', function(msg){
      $('#messages').append($('<li>').text(msg));
    });
  });
</script>
  </body>
</html>

Socket.IO聊天
*{边距:0;填充:0;框大小:边框框;}
正文{字体:13px Helvetica,Arial;}
表单{background:#000;填充:3px;位置:固定;底部:0;宽度:100%;}
表单输入{边框:0;填充:10px;宽度:90%;右边距:0.5%;}
窗体按钮{宽度:9%;背景:rgb(130224255);边框:无;填充:10px;}
#消息{列表样式类型:无;边距:0;填充:0;}
#消息li{padding:5px 10px;}
#留言李:第n个孩子(奇数){背景:#eee;}


登录/注册
    发送 $(函数(){ var socket=io(); $(文档).ready(函数(){ $(“#聊天窗口”).hide(); $(“#chatLoginBtn”)。单击(函数(){ socket.emit('loginForm'{ 用户名:$(“#用户名”).val(), 密码:$(“#密码”).val() }); }); }); socket.on('returnValue',函数(msg){ var html='
      '+ '' + “发送”+ ''; $(“#chatLogin”).html(“”.hide(); $(“#聊天窗口”).html(html).show(); $('#sendMsg')。提交(函数(e){ e、 preventDefault();//防止页面重新加载 var time=Date.now(); var msg=$(“#m”).val(); var数据=[时间,msg]; 发出('chat',数据); $('m').val(''); 返回false; }); }); socket.on('chat',函数(msg){ $(“#消息”).append($(“
    • ”).text(msg)); }); });
    • index.js

      var app = require('express')();
      var http = require('http').createServer(app);
      var phpPass = require('node-php-password');
      var mysql = require('mysql');
      var io = require('socket.io')(http);
      var cookieParser = require('cookie-parser');
      var session = require('express-session');
      
      // DECLARE the variables we will be using
      
      // These does not change
      let userCount = 0;
      
      // These are declared to be later set
      
      var displayName;
      var userDataID;
      
      
      // POOL MySQL Connection
      
      var pool    =    mysql.createPool({
            connectionLimit   :   100,
            host              :   'localhost',
            user              :   'root',
            password          :   '....',
            port              :   '3306',
            database          :   '....',
            debug             :   false
      });
      
      // session & cookieParser
      
      /*var sessionMiddleware = session({
          secret: "keyboard cat"
      });
      
      io.use(function (socket, next) {
              sessionMiddleware(socket.request, socket.request.res, next);
      });
      app.use(sessionMiddleware);
      app.use(cookieParser());*/
      
      app.get('/', (req, res) => {
        res.sendFile(__dirname + '/index.html');
      });
      
      var hashPassword;
      
      
      
      function checkUser(user, Password, userID) {
          pool.getConnection(function(error,connection) {
              connection.query("SELECT password FROM accounts WHERE `username` = '"+user+"' LIMIT 1",function(error,rows){
                  if (!error) {
                  var hashPassword = rows[0].password;
      
                  if (phpPass.verify(Password, hashPassword)) {
                      console.log(Password);
                      console.log(hashPassword);
                      console.log("Went well");
      
                      // UPDATE user database with current socketID
      
                      connection.query("UPDATE accounts SET `socketID` = '"+userID+"' WHERE `username` = '"+user+"'",function(error,result){
                          connection.release();
                          if (!error) {
                              connection.query("SELECT id,displayName,username,email,fullName,dateofBirth,created,lastSignedIn FROM accounts WHERE socketID = '"+userID+"' LIMIT 1",function(error,userData){
                                  if (!error) {
                                      displayName = userData[0].displayName;
                                      userDataID = userData[0].id;
                                      console.log("Current user: " + userData[0].displayName);
                                  } else {
                                      console.log("Error" + error);
                                  }
      
                              });
      
                              console.log("No error" + result);
                          } else {
                              console.log("We found error" + error);
                          }
                      });
      
                      // send to function to gather all needed info from database and save for the current session
      
      
      
                      return true;
                  } else {
                      console.log("Wrong pass");
                      return false;
                  }
      
                  console.log(hashPassword);
                  } else {
                      console.log(error);
                      return false;
                  }
              });
              connection.on('error', function(error) {
      
              });
          });
              return true;
      };
      
      
      io.on('connection', (socket) => {
      
          var req = socket.request;
          var userID = socket.id;
      // When connection is inited
      
          userCount++;
      
          console.log('User connected' + userCount);
      
          // Take the data from login and pass to check if it is valid
      
          socket.on("loginForm", function(data){
              const user = data.username,
              pass = data.password;
              //console.log(checkUser(user, pass));
              if (checkUser(user, pass, userID)) {
                  io.emit('returnValue', 'hi');
              }
          });
      
          function joinRoom(room) {
              socket.join(room);
              console.log("Joined " + room);
              return io.emit('chat', "Joined new room " + room);
          }
      
          socket.on('join', (data) => {
              socket.join(data);
              console.log("Joined " + data);
          });
      
      
          socket.on('chat', (data) => {
      
              /* Array: Data;
              [0] Time
              [1] Message
      
      
              [2] socketID
              [3] User        
              */
      
              var msg = data[1];
              var time = data[0];
      
      
      
              // Calc time
      
              var date = new Date(time);
              var hours = date.getHours();
              var minutes = date.getMinutes();
              var formatted = hours + ":" + minutes;
              if (minutes < 10) return minutes = "0" + minutes;
              var dateFormatted = "[" + formatted + "] ";
      
              //data.push(user);
      
              pool.getConnection(function(error,connection) {
              connection.query("INSERT INTO `chat_messages` (userID, socketID, message, time) VALUES ('"+userDataID+"', '"+userID+"', '"+msg+"', '"+time+"')",function(error,rows){
                  connection.release();
                  if (!error) {
                      console.log("Success");
                  } else {
                      console.log(error);
                  }
              });
              });
      
      
              if (msg.startsWith('/me')) return io.emit('chat', dateFormatted + displayName + msg.substring(3));
              if (msg.startsWith('/join')) return joinRoom(msg.substring(6));
              if (msg.startsWith('/rooms')) return console.log(io.sockets.adapter.rooms);
      
              return io.emit('chat', dateFormatted + displayName + ' said: ' + msg);
              //console.log(displayName + 'said:' + msg);
          });
      
      // When user disconnects
        socket.on('disconnect', () => {
      
          userCount--;
      
          console.log('User disconnected!' + userCount);
        });
      
      
      });
      
      http.listen(3000, () => {
          console.log('Listening on *:3000');
      });
      
      var-app=require('express')();
      var http=require('http')。createServer(应用程序);
      var phpPass=require('node-php-password');
      var mysql=require('mysql');
      var io=require('socket.io')(http);
      var cookieParser=require('cookie-parser');
      var会话=需要(“快速会话”);
      //声明我们将要使用的变量
      //这些并没有改变
      让userCount=0;
      //这些将声明为稍后设置
      变量显示名;
      var-userDataID;
      //池MySQL连接
      var pool=mysql.createPool({
      连接限制:100,
      主机:“localhost”,
      用户:'根',
      密码:'..',
      港口:'3306',
      数据库:“…”,
      调试:false
      });
      //会话与cookieParser
      /*var sessionMiddleware=会话({
      秘密:“键盘猫”
      });
      io.use(函数(套接字,下一个){
      sessionMiddleware(socket.request,socket.request.res,next);
      });
      应用程序使用(sessionMiddleware);
      使用(cookieParser())*/
      应用程序获取(“/”,(请求,请求)=>{
      res.sendFile(uu dirname+'/index.html');
      });
      var-hashPassword;
      函数checkUser(用户、密码、用户ID){
      pool.getConnection(函数(错误,连接){
      connection.query(“从帐户中选择密码,其中'username`='”+user+“'LIMIT 1”,函数(错误,行){
      如果(!错误){
      var hashPassword=行[0]。密码;
      if(phpPass.verify(Password,hashPassword)){
      console.log(密码);
      console.log(hashPassword);
      日志(“进展顺利”);
      //使用当前socketID更新用户数据库
      connection.query(“更新帐户集`socketID`='”+userID+”,其中`username`='“+user+”,函数(错误,结果){
      连接。释放();
      如果(!错误){
      connection.query(“选择id、displayName、用户名、电子邮件、全名、出生日期、已创建、上次登录的帐户,其中socketID=”“+userID+”“LIMIT 1”,函数(错误,userData){
      如果(!错误){
      displayName=userData[0]。displayName;
      userDataID=userData[0].id;
      console.log(“当前用户:+userData[0].displayName”);
      }否则{
      console.log(“错误”+错误);
      }
      });
      console.log(“无错误”+结果);
      }否则{
      log(“我们发现错误”+错误);
      }
      });
      //send to function可从数据库中收集所有需要的信息,并为当前会话保存
      返回true;
      }否则{
      控制台日志(“错误传递”);
      返回false;
      }
      console.log(hashPassword);
      }否则{
      console.log(错误);
      返回false;
      }
      });
      connection.on('error',函数(error){
      });
      });
      返回true;
      };
      io.on('连接',(套接字)=>{
      var req=socket.request;
      var userID=socket.id;
      //当连接被初始化时
      userCount++;
      log('User connected'+userCount);
      //从登录中获取数据并通过以检查其是否有效
      socket.on(“loginForm”,函数(数据){
      const user=data.username,
      pass=data.password;
      //日志(checkUser(user,pass));
      if(检查用户(用户、通行证、用户ID)){
      io.emit('returnValue','hi');
      }
      });
      功能室{
      插座连接(房间);
      console.lo