当刷新浏览器时,Node.js服务器崩溃了。

3

我尝试用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)

我使用了 node --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);

当我注释掉第四行时,导入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 文件吗? - SHUMING LU
@LucienLu 添加了 - 周雪静
4个回答

3

我猜你可能在html文件中执行了var ws = new WebSocket("ws://localhost:3001");。由于我不精通WebSocket,所以无法确定你的错误原因。但是有一个解决方案:

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

在重新加载之前关闭连接,这样错误就不会再次出现。

2

你需要在socket上添加错误监听器。仅在websocket实例上添加错误监听器在这种情况下是不起作用的。

    socket.on('error', function(e){
        console.log(e);
    });


1
"

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) { 这一行之前,您是否尝试过使用代码来监听 "error" 事件?如果是,请使用 ws 而不是 wss - Usama Ejaz

0

我曾经遇到同样的问题,但是在执行这个命令后问题得到了解决:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接