Запустил веб-сокет в файле server.js - почему отправка сообщения в сокет из router.js приводит к ошибке EADDRINUSE? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь настроить событие websockets для запуска по заданному запросу POST, но оно не работает. Я создал веб-сокет в server.js, и в настоящее время я могу отправлять сообщение WebSockets на сервер каждые 20 секунд, включив его в файл server.js:

var port     = process.env.PORT || 8080;
const server = app.listen(port, () => console.log(`Listening on ${ port }`));
const wss = new SocketServer({ server });
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());
    });
}, 20000);

Приведенный выше код работает правильно. Я знаю, что он работает, потому что я включил этот сценарий на одну из страниц сайта, и он корректно обновляет элемент 'server-time':

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

Но я не хочу просто отправлять данные на сайт каждые 20 секунд. Я пытаюсь вызвать событие, когда пользователь выполняет определенный запрос POST, поэтому я пытаюсь сохранить код на странице rout.js. Таким образом, в основном, вместо того, чтобы обновлять элемент «серверное время» каждые 20 секунд, я хочу, чтобы он обновлялся, когда пользователь нажимает определенную кнопку на сайте. Это нажатие кнопки запускает запрос POST, что я и хочу, чтобы вызвать изменения в HTML. Вот как это выглядит сейчас:

app.post( '/',function(req,res){
        var port     = process.env.PORT || 8080;
        const server = app.listen(port, () => console.log(`Listening on ${ port }`));
        const wss = new SocketServer({ server });    
        wss.clients.forEach((client) => {
        client.send("Sending message");
        });
        res.render('pages/indextimewithall.ejs);
    })

... но это приводит к ошибке EADDRINUSE. Моя проблема в том, что я думаю, что после того, как я создал веб-сокет в файле server.js, я не знаю, как правильно получить к нему доступ из файла rout.js. Есть идеи? Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018
//server.js
let express = require('express');
let path = require('path');
let SocketServer = require('socket-server');

let app = express();
let port = 8080;
let server = app.listen(port, function() {
  console.log(`Listening on ${port}`);
});

let wss = new SocketServer({server});
wss.on('connection', function(ws) {
  console.log('Client connected');
  ws.on('close', function() {
    console.log('Client disconnected');
  });
});

function sendMessage(msg) {
  console.log('sending...');
  wss.clients.forEach(function(client) {
    client.send(msg);
  });
}

app.get('/page.html', function(req, res) {
  res.sendFile(path.join(__dirname, 'page.html'));
});

app.get('/', function(req, res) {
  sendMessage('event');
  res.send('triggered');
});

setInterval(function() {
  sendMessage('timer');
}, 20000);

Я запускаю событие по запросу страницы '/'. Итак, я использовал метод get. Измените его в соответствии с вашим вариантом использования. Вам не нужны серверы с двумя узлами.

Ниже приведен пример страницы, чтобы продемонстрировать это.

<!--page.html-->
<html>
<body>
  <p id='ser'>placeholder</p>
  <script>
    var HOST = location.origin.replace(/^http/, 'ws');
    var ws = new WebSocket(HOST);
    var e = document.getElementById('ser');
    ws.onmessage = function (event) {
      e.innerHTML = 'Msg: ' + event.data;
    }
  </script> 
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...