簡體   English   中英

客戶端斷開連接時出現node.js錯誤

[英]node.js error upon client disconnect

我正在使用node.js,並且每次客戶端斷開連接時都會在圖片中出現錯誤(這種情況發生在我僅關閉選項卡並且還嘗試在客戶端和服務器端都使用socket.disconnect()時)

我收到錯誤

這是我的代碼

var io = require('socket.io').listen(4000);
var fs = require('fs');

io.sockets.on('connection', function(socket) {
  socket.on('login', function(info)
  {
      fs.readFile("chatLog.txt", function(err, data)
      {
          if(err)
          {
              return console.error(err);
          }
          socket.emit('incomingMessage', data.toString());
      });
      socket.broadcast.emit('newUser', info);
  });
  socket.on('message', function(content) {
    console.log(content); 
    io.sockets.emit('incomingMessage', content);
  });
  socket.on('logout', function(name)
  {
     socket.broadcast.emit('incomingMessage', "user: " + name + " has logged out");
     //socket.disconnect();
  });
});

誰能告訴我如何在不導致服務器崩潰的情況下斷開連接?

客戶端HTML:

<html>
<head>
<!-- This is the websocket SERVER -->
<script src="http://localhost:4000/socket.io/socket.io.js"></script>
<script src="client.js"></script>

</head>
<body>
<div id="loginDiv">
    username: <input type="text" id = "userName"><br>
    <input type = "button" id="login" value = "login" onClick="login()">
</div>
<div id="logoutDiv" style="visibility:hidden">
    <input type = "button" id = "messageRedir" value = "send message" onClick= "gotoMessage()">
    <input type = "button" id = "logout" value = "logout" onClick="logout()">
</div>
<div id="sendMessage" style="visibility:hidden">
    <input type = "text" id="messageBox"><br>
    <input type = "button" value="send message" onClick="sendMessage()">
    <input type = "button" value = "cancel" onClick="back">
</div>
<div id="msg"></div> 
</body> 
</html>

客戶端JS:

var userName = null;
var socket = null;
function login()
{

  socket = io.connect('http://localhost:4000');
  userName = document.getElementById('userName').value;
  document.getElementById("loginDiv").style.visibility = "hidden";
  document.getElementById("logoutDiv").style.visibility = "visible";
  socket.emit('login', userName+ ' has connected');

  // Attach event handler for event fired by server
  socket.on('incomingMessage', function(data) {
     var elem = document.getElementById('msg'); 
     console.log(data);
     elem.innerHTML =  data + "<br>" + elem.innerHTML; // append data that we got back
  });
   socket.on('newUser', function(data) {
     var elem = document.getElementById('msg'); 
     console.log(data);
     elem.innerHTML =  data + "<br>" + elem.innerHTML; // append data that we got back
  });
}

function logout()
{
    document.getElementById("loginDiv").style.visibility = "visible";
    document.getElementById("logoutDiv").style.visibility = "hidden";
    document.getElementById('msg').innerHTML = "";
    socket.emit('logout', userName);
    socket.disconnect();
    socket = null;
}

function gotoMessage()
{
    document.getElementById("loginDiv").style.visibility = "hidden";
    document.getElementById("msg").style.visibility = "hidden";
    document.getElementById("sendMessage").visibility = "visible";
}

function back()
{
    document.getElementById("loginDiv").style.visibility = "visible";
    document.getElementById("msg").style.visibility = "visible";
    document.getElementById("sendMessage").visibility = "hidden";
}

function sendMessage()
{
    var mess = document.getElementById('messageBox').value;
    socket.emit('message', mess);
}

問題最可能出在您使用套接字(不再活動)發出事件的注銷功能中。 您應該改用io.sockets.emit 我有一些建議。

不用在客戶端使用socket.emit('logout', username)事件,而是使用內置的注銷事件,該事件在用戶關閉瀏覽器時觸發。 該事件是disconnect 您也不需要在每個請求中都傳遞用戶名。 您只需要在登錄事件中傳遞一次即可。 然后,您可以將用戶名作為套接字的屬性存儲在服務器上。

客戶端

 function login() { socket = io.connect('http://localhost:4000'); userName = document.getElementById('userName').value; document.getElementById("loginDiv").style.visibility = "hidden"; document.getElementById("logoutDiv").style.visibility = "visible"; // just send the username socket.emit('login', userName); // Attach event handler for event fired by server socket.on('incomingMessage', function(data) { var elem = document.getElementById('msg'); console.log(data); elem.innerHTML = data + "<br>" + elem.innerHTML; // append data that we got back }); socket.on('newUser', function(data) { var elem = document.getElementById('msg'); console.log(data); elem.innerHTML = data + "<br>" + elem.innerHTML; // append data that we got back }); } function logout() { document.getElementById("loginDiv").style.visibility = "visible"; document.getElementById("logoutDiv").style.visibility = "hidden"; document.getElementById('msg').innerHTML = ""; socket.disconnect(); socket = null; } 

服務器端

io.sockets.on('connection', function(socket) {
  socket.on('login', function(uxname)
  {
      // store username variable as property of the socket connection
      // this way we can handle the disconnect message later
      this.username = uxname;

      fs.readFile("chatLog.txt", function(err, data)
      {
          if(err)
          {
              return console.error(err);
          }
          socket.emit('incomingMessage', data.toString());
      });
      socket.broadcast.emit('newUser', uxname);
  });
  socket.on('message', function(content) {
    console.log(content); 
    io.sockets.emit('incomingMessage', content);
  });
  socket.on('disconnect', function(){
       // don't use socket.broadcast.emit. at this point the socket is destroyed and you cant call events on it. That is most likely why you have the error.
       // use io.sockets.emit instead
       io.sockets.emit('incomingMessage', "user: " + this.username + " has logged out")
  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM