ExpressJS路由+ Web套接字-共享端口

时间:2018-09-28 21:10:15

标签: node.js express https websocket port

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

不幸的是,我只有1个端口用于服务器和Websocket。我该如何设置,以便 app 服务器都可以在同一端口上监听?

我已经在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”(不安全)方法。

1 个答案:

答案 0 :(得分:1)

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

此行创建一个新的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 );
});

您不能那样做。如果您只想让一个https服务器既可用于Web请求又可用于webSocket(一种常见的处理方式),则将代码更改为此:

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 );
});

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