【问题标题】:Node.js Server crashed when Refresh BrowserNode.js 服务器在刷新浏览器时崩溃
【发布时间】:2018-01-12 03:13:42
【问题描述】:

我尝试通过 node.js 构建一个聊天框服务器。当浏览器请求页面时,它一开始运行良好。但是当我刷新页面时,服务器崩溃了。

以下是错误信息:

events.js:183
  throw er; // Unhandled 'error' event
  ^

Error: read ECONNRESET
    at _errnoException (util.js:1022:11)
    at TCP.onread (net.js:615:25)

我使用了节点--inspect index.js,但找不到重点。

下面是index.js的代码:

const http = require('http');
const fs = require('fs');
const extract = require('./extract');
const wss = require('./websockets-server');

var handleError = function (err,res) {
  res.writeHead(404);
  res.end();
}

var server = http.createServer(function (req, res) {
  console.log("Responding to a request.");
  var filePath = extract(req.url);
  console.log("filePath:"+filePath);
  fs.readFile(filePath,function (err,data) {
    if(err){
      handleError(err,res);
      return;
    }else {
      res.end(data);
    }
  })
})

server.listen(3000);

当我注释第 4 行时,websockets-server 的导入。刷新页面时服务器运行良好。也许它是关于 websocket 而它在没有 websocket 的情况下工作。

下面是websockets-server.js的代码:

const WebSocket = require('ws');
var WebSocketServer = WebSocket.Server;
var port = 3001;
var ws = new WebSocketServer({
  port:port
});

var message = [];

console.log('websockets server started');

ws.on('connection', function (socket) {
  console.log('client connection established');

  message.forEach(function (msg) {
    socket.send(msg);
  })

  socket.on('message', function (data) {
    console.log('message received: ' + data);
    message.push(data);
    ws.clients.forEach(function (clientSocket) {
      clientSocket.send(data);
    });
  });
});

问题是关于 websocket 的吗?当客户端在刷新页面时关闭与服务器的连接时是否应该进行处理。

extract.js 如下:

const path = require('path');

var extractFilePath = function (url) {
  var filePath;
  var fileName = 'index.html';

  if(url.length > 1){
    fileName = url.substring(1);
  }
  console.log('The fileName is: ' + fileName);

  filePath = path.resolve(__dirname, 'app', fileName);
  return filePath;
}
module.exports = extractFilePath;

【问题讨论】:

  • 你能提供extract.js吗?
  • @LucienLu 添加

标签: javascript node.js websocket chat inspect


【解决方案1】:

我猜你可能会在 html 文件中执行var ws = new WebSocket("ws://localhost:3001");。由于我不精通 WebSocket,因此我还没有弄清楚您的错误的确切原因。但是有一个解决方案:

window.onbeforeunload = function () {
    ws.close();
}

重新加载前关闭连接,则错误不会再次出现。

【讨论】:

    【解决方案2】:

    您需要在套接字上添加一个错误侦听器。在这种情况下,仅 websocket 实例上的错误侦听器没有帮助。

    socket.on('错误', function(e){ 控制台.log(e); });

    【讨论】:

      【解决方案3】:

      ECONNRESET 错误表示对方(浏览器)突然关闭了连接。在浏览器刷新时,浏览器简单地终止了与 websocket 服务器的连接。

      要解决这个问题,您必须在 websocket 服务器实例上监听 error 事件。

      // listen for "error" event so that the whole app doesn't crash
      wss.on("error", function(error){
          console.log(error);
      }
      

      【讨论】:

      • 您能否详细说明这样做的结果?在您的 websockets-server.js 中,就在 ws.on('connection', function (socket) { 行之前,您是否尝试过使用代码来侦听“错误”事件?您将使用ws 而不是wss(如果是这样的话)。
      【解决方案4】:

      我遇到了同样的问题,但是在这个命令之后它解决了:

      npm install @ionic/app-scripts@nightly --save-dev
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多