ExpressJS Routes + Websockets - Порт общего доступа - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть сервер https expressjs с веб-сокетами (используется пакет 'ws').Насколько я понимаю сокеты и порты, я должен иметь возможность добавить маршрут наряду с соединениями веб-сокетов.Основной вариант использования таков, что сервер может быть свернут (ни один из запросов ws curl, которые я видел в сети, не работал).

К сожалению, у меня есть только один порт для сервера и веб-сокетов.Как я могу настроить это так, чтобы app и server могли одновременно прослушивать один и тот же порт?

Я видел несколько комментариев о 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«ошибка, поскольку я использую один и тот же порт для двух« серверов ».

FOLLOW-UP

  • Приложение Express не должно также прослушивать, еслидругой сервер.
  • Чтобы свернуть https, вы должны предоставить детали сертификата или использовать метод -k (небезопасный).

1 Ответ

0 голосов
/ 29 сентября 2018

Ваш код показывает, что вы пытаетесь запустить два сервера на одном и том же порту.

Эта строка создает новый 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-сервер, который будет работать как для ваших веб-запросов, так и для вашего 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.

...