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

Hyp*_*sis 5 websocket node.js express node-modules

我正在运行一个 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)
Run Code Online (Sandbox Code Playgroud)

Express 的服务器上的代码如下所示:

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);
});
Run Code Online (Sandbox Code Playgroud)

我也在同一个端点上使用 Websocket,代码如下所示:

const wss = new Websocket.Server({ server })
    console.log(url)
    wss.on('connection', ws => {
        console.log('user is connected to the server #mainpage')
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决它,因为应用程序似乎没有为新的刷新创建应用程序的新实例。

我该如何处理这个问题并使我的应用程序持续运行?

Goo*_*ian 15

这是因为您已经使用创建了服务器express,并且handleUpgrade在内部调用了该方法express,因此您需要通知您的WebSocket服务器忽略服务器启动部分并继续使用现有资源,给出的选项如下{ noServer: true }

const wss = new WebSocket.Server({ noServer: true });

server.on('upgrade', function (request, socket, head) {
  wss.handleUpgrade(request, socket, head, function (ws) {
     wss.emit('connection', ws, request);
  })
})
Run Code Online (Sandbox Code Playgroud)


小智 1

嗯,在我的项目中,我使用的是express-monitor,它也使用了socket.io,因此导致服务器处理ws连接请求的升级以及socket.io初始化。

删除 Express-Monitor 解决了这个问题