Веб-сокеты с Node JS, Express, Heroku: добавление маршрутов разрывает соединение с веб-сокетами - PullRequest
0 голосов
/ 18 октября 2018

Первый раз ТАК сообщение!

Я новичок в Jode JS, и мне нужна помощь, пока я следую учебному пособию по Heroku: https://devcenter.heroku.com/articles/node-websockets (вариант 1)

Я создаю приложение, которое будетиспользуйте веб-сокеты с node.js, Heroku и Express.Когда я запускаю код server.js прямо, как в примере выше, он работает.Сейчас я пытаюсь добавить маршруты, и это по какой-то причине разрывает соединение с веб-сокетом.

server.js:

'use strict';

const express = require('express');
const SocketServer = require('ws').Server;
const path = require('path');

const PORT = process.env.PORT || 3000;
const INDEX = path.join(__dirname, 'index.html');

const server = express()

const ADMIN= path.join(__dirname, +'/admin/' + 'adminPage.html');

const wss = new SocketServer({ server });


  var router = express.Router();

 var app=express();
    // home page route
    router.get('/', function(req, res) {
        res.sendFile(INDEX);
    });
    // admin page route
    router.get('/admin', function(req, res) {
        res.sendFile(ADMIN);
    });
    // apply the routes to our application
    app.use(express.static('public'))
    app.use('/', router);

    app.listen(PORT, () => console.log(`Listening on ${ PORT }`));

    wss.on('connection', (ws) => {
      console.log('Client connected');
      ws.on('close', () => console.log('Client disconnected'));
    });

setInterval(() => {
    wss.clients.forEach((client) => {
      client.send(new Date().toTimeString());
    });
  }, 1000);

Текущий Index.html:

  <p id='server-time'></p>
    <script>
      var HOST = location.origin.replace(/^http/, 'ws')
      var ws = new WebSocket(HOST);
      var el = document.getElementById('server-time');
      ws.onmessage = function (event) {
        el.innerHTML = 'Server time: ' + event.data;
      };
    </script>

Перенаправление на страницу администратора работает, но страница index.html возвращает следующееошибка:

**WebSocket connection to 'ws://localhost:3000/' failed: Error during WebSocket handshake: Unexpected response code: 200**

Я уверен, что это простая ошибка, но я просто не могу ее найти - благодарю всех за помощь!

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Спасибо за помощь, Сами!Я пытался удалить приложение, как вы предложили, но оно все равно не работало.Я нашел другой онлайн-ресурс, и это окончательный рабочий код:

const SocketServer = require('ws').Server;
var express = require('express');
var path = require('path');
//init Express
var app = express();
//init Express Router
var router = express.Router();
var port = process.env.PORT || 3000;
var admin = path.join(__dirname, '/admin/adminPage.html');

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});
app.get('/admin', function(req, res) {
    res.sendFile(admin);
});
var server = app.listen(port, function () {
    //listening
})
const wss = new SocketServer({ server });

wss.on('connection', function connection(ws) {
    console.log("connection ...");
});
setInterval(() => {
    wss.clients.forEach((client) => {
      client.send(new Date().toTimeString());
    });
  }, 1000);
0 голосов
/ 18 октября 2018

Вы создаете два экземпляра express: app и server.Вы используете первый для маршрутизатора и настраиваете его на прослушивание, а второй для веб-сокетов.Вы не устанавливаете вторую для прослушивания чего-либо, поэтому невозможно установить соединения через веб-сокет.Я предполагаю, что вы хотели использовать server для всего, поэтому удалите app и подключите маршрутизатор и т. Д. К server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...