如何处理server.handleUpgrade在Nodejs中被多次调用?

问题描述

我正在运行一个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初始化的升级。

删除快递员可以解决此问题