ExpressJS 路由 + Websockets - 共享端口



我有一个带有websockets的https expressjs服务器(使用'ws'包(。据我了解套接字和端口,我应该能够在 websocket 连接旁边添加一个路由。主要用例是使服务器可以卷曲(我在网上看到的ws curl请求都没有工作。

不幸的是,我只有 1 个端口用于服务器和 websocket。如何进行设置,以便应用程序和服务器都可以侦听同一端口?

我已经看到一些关于 SO 的评论,表明它可以完成,但没有代码示例,或者它适用于非常不同的包。

我正在使用"ws"包:https://www.npmjs.com/package/ws

const port = 8888;
const http = require('http');
const https = require('https');
const express = require('express');
const websocket = require('ws');
const app = express();
app.use( express.static('public') );
app.get('/curl', (req, res) => res.send('Hello World')).listen( port );
const httpsServer = https.createServer( credentials, app );
const wss = new websocket.Server({ server: httpsServer });
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});

目前我收到"EADDRINUSE"错误,因为我对两个"服务器"使用相同的端口。

跟进

  • Express 应用程序不需要也侦听另一台服务器是否在。
  • 要卷曲 https,您必须提供证书详细信息,或使用"-k"(不安全(方法。

您的代码显示您尝试在同一端口上启动两台服务器。

此行创建一个新的 http 服务器,并尝试在端口 8888 上启动它:

app.get('/curl', (req, res) => res.send('Hello World')).listen( port );

这些行创建一个新的 https 服务器,并尝试在端口 8888 上启动它。

const httpsServer = https.createServer( credentials, app );
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});

你不能那样做。 如果你只需要一个同时适用于你的Web请求和webSocket的https服务器(一种常见的做事方式(,那么请将你的代码更改为:

const port = 8888;
const https = require('https');
const express = require('express');
const websocket = require('ws');
const app = express();
app.use( express.static('public') );
app.get('/curl', (req, res) => res.send('Hello World'));
const httpsServer = https.createServer( credentials, app );
const wss = new websocket.Server({ server: httpsServer });
httpsServer.listen( port, function listening(){
console.log( 'listening on ' + port );
});

它只是删除在app对象上运行的.listen(port),因为这将创建一个 HTTP 服务器并在 8888 端口上启动它。

最新更新