问题描述
我正在运行一个nodejs应用程序,该应用程序在我第一次使用时运行得很好,但是当我刷新并输入新数据时,Node崩溃了,并给出了这个提示。错误看起来像这样:
/www/wwwroot/domain.to/node_modules/ws/lib/websocket-server.js:267
throw new Error(
^
Error: server.handleUpgrade() was called more than once with the same socket,possibly due to a misconfiguration
at WebSocketServer.completeUpgrade (/www/wwwroot/domain.to/node_modules/ws/lib/websocket-server.js:267:13)
at WebSocketServer.handleUpgrade (/www/wwwroot/domain.to/node_modules/ws/lib/websocket-server.js:245:10)
at Server.upgrade (/www/wwwroot/tehran.us.to/node_modules/ws/lib/websocket-server.js:89:16)
at Server.emit (events.js:327:22)
at onParserExecuteCommon (_http_server.js:646:14)
at onParserExecute (_http_server.js:587:3)
服务器上的代码如下所示:
const app = express();
const options = {
key: fs.readFileSync('./key.pem'),cert: fs.readFileSync('./cert.pem')
};
const server = https.createServer(options,app)
server.listen(3000,function () {
console.log("Express server listening on port " + 3000);
});
我还在同一端点上使用Websocket,代码看起来像这样:
const wss = new Websocket.Server({ server })
console.log(url)
wss.on('connection',ws => {
console.log('user is connected to the server #mainpage')
我不知道如何解决它,因为该应用程序似乎没有为新的刷新创建该应用程序的新实例。
我该如何处理并使我的应用程序连续运行?
解决方法
这是因为您已经使用express
创建了服务器,并且在handleUpgrade
内部调用了express
方法,因此您需要通知WebSocket
服务器忽略该命令。服务器启动部分,并继续使用现有资源,如{ noServer: true }
const wss = new WebSocket.Server({ noServer: true });
server.on('upgrade',function (request,socket,head) {
wss.handleUpgrade(request,head,function (ws) {
wss.emit('connection',ws,request);
})
})
,
好吧,在我的项目中,我使用的是express-monitor,它也使用了socket.io,因此导致服务器处理ws连接请求以及socket.io初始化的升级。
删除快递员可以解决此问题