Node.js 刷新浏览器时服务器崩溃
Node.js Server crashed when Refresh Browser
我试图通过 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;
ECONNRESET
错误表示对方(浏览器)突然关闭了连接。在浏览器刷新时,浏览器简单地终止了与 websocket 服务器的连接。
要解决这个问题,您必须在 websocket 服务器实例上监听 error
事件。
// listen for "error" event so that the whole app doesn't crash
wss.on("error", function(error){
console.log(error);
}
我猜你可能在 html 文件中执行 var ws = new WebSocket("ws://localhost:3001");
。我还没有弄清楚你的错误的确切原因,因为我不精通 WebSocket。但是有一个解决方案:
window.onbeforeunload = function () {
ws.close();
}
重新加载前关闭连接,错误不会再出现。
您需要在套接字上添加一个错误侦听器。仅在 websocket 实例上的错误侦听器在这种情况下无济于事。
socket.on('error', function(e){
console.log(e);
});
我遇到了同样的问题,但在执行以下命令后问题解决了:
npm install @ionic/app-scripts@nightly --save-dev
我试图通过 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;
ECONNRESET
错误表示对方(浏览器)突然关闭了连接。在浏览器刷新时,浏览器简单地终止了与 websocket 服务器的连接。
要解决这个问题,您必须在 websocket 服务器实例上监听 error
事件。
// listen for "error" event so that the whole app doesn't crash
wss.on("error", function(error){
console.log(error);
}
我猜你可能在 html 文件中执行 var ws = new WebSocket("ws://localhost:3001");
。我还没有弄清楚你的错误的确切原因,因为我不精通 WebSocket。但是有一个解决方案:
window.onbeforeunload = function () {
ws.close();
}
重新加载前关闭连接,错误不会再出现。
您需要在套接字上添加一个错误侦听器。仅在 websocket 实例上的错误侦听器在这种情况下无济于事。
socket.on('error', function(e){ console.log(e); });
我遇到了同样的问题,但在执行以下命令后问题解决了:
npm install @ionic/app-scripts@nightly --save-dev