我有一个带有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 端口上启动它。