Express i WebSocket nasłuchują na tym samym porcie

Mam aplikację.js, który jest używany do wyzwalania dwóch zdarzeń, gdy niektóre dane POST są odbierane:

  1. Wstaw dane POST do bazy danych
  2. Wyślij wiadomość do klienta za pomocą WebSocket

Oto aplikacja .js (tylko ważne linie)

var express = require('express');
var bodyParser = require('body-parser');
var server = require('./server');

var app = express();
var port = process.env.PORT || 3000;

app.post('/server', server);

app.listen(port, function(){
  console.log('Slack bot listening');
});

A oto Serwer .js (tylko ważne linie)

var db = require('./DB');
var WebSocketServer = require('ws').Server;

var insertData = function(req, res){

    var wss = new WebSocketServer({server: server});
    console.log('WebSocketServer created');
    wss.on('connection', function(wss){
        wss.send(JSON.stringify('Socket open'));
    });
    wss.on('close', function(){
        console.log('WebServerSocket has been closed');
    });
};

module.exports = insertData;

To, co chciałbym osiągnąć, to ustawić WebSocketServer w taki sposób, aby nasłuchiwał tego samego portu aplikacji. I myślałem o przejściu serwera var z aplikacji.js na Serwer .js Ale

  1. myślę, że to nie jest elegancki sposób, aby to zrobić
  2. Nie wiem jak to zrobić
Co myślicie?
Author: Mornor, 2016-01-15

1 answers

W oparciu o Twój kod i komentarze, oto bardzo prosty przykład, jak to będzie działać razem.

Po pierwsze,http-server.js - typowa aplikacja express, z tą różnicą, że nie uruchamiamy serwera z app.listen():

'use strict';

let fs = require('fs');
let express = require('express');
let app = express();
let bodyParser = require('body-parser');

app.use(bodyParser.json());

// Let's create the regular HTTP request and response
app.get('/', function(req, res) {

  console.log('Get index');
  fs.createReadStream('./index.html')
  .pipe(res);
});

app.post('/', function(req, res) {

  let message = req.body.message;
  console.log('Regular POST message: ', message);
  return res.json({

    answer: 42
  });
});

module.exports = app;

Teraz,ws-server.js przykład, gdzie tworzymy serwer WSS z natywnego węzła http.createServer(). Zauważ, że to tutaj importujemy aplikację i dajemy ten natywny http.createServer instancja aplikacji do użycia.

Uruchom aplikację z PORT=8080 node ws-server.js:

'use strict';

let WSServer = require('ws').Server;
let server = require('http').createServer();
let app = require('./http-server');

// Create web socket server on top of a regular http server
let wss = new WSServer({

  server: server
});

// Also mount the app here
server.on('request', app);

wss.on('connection', function connection(ws) {

  ws.on('message', function incoming(message) {

    console.log(`received: ${message}`);

    ws.send(JSON.stringify({

      answer: 42
    }));
  });
});


server.listen(process.env.PORT, function() {

  console.log(`http/ws server listening on ${process.env.PORT}`);
});

Wreszcie ta próbka index.html będzie działać poprzez utworzenie zarówno postu, jak i gniazda "request" i wyświetlenie odpowiedzi:

<html>
<head>
  <title>WS example</title>
</head>

<body>
  <h2>Socket message response: </h2>
  <pre id="response"></pre>
  <hr/>
  <h2>POST message response: </h2>
  <pre id="post-response"></pre>
  <script>

  // Extremely simplified here, no error handling or anything
document.body.onload = function() {

    'use strict';

  // First the socket requesta
  function socketExample() {
    console.log('Creating socket');
    let socket = new WebSocket('ws://localhost:8080/');
    socket.onopen = function() {

      console.log('Socket open.');
      socket.send(JSON.stringify({message: 'What is the meaning of life, the universe and everything?'}));
      console.log('Message sent.')
    };
    socket.onmessage = function(message) {

      console.log('Socket server message', message);
      let data = JSON.parse(message.data);
      document.getElementById('response').innerHTML = JSON.stringify(data, null, 2);
    };
  }

  // Now the simple POST demo
  function postExample() {

    console.log('Creating regular POST message');

    fetch('/', {  
      method: 'post',  
      headers: {  
        "Content-type": "application/json"  
      },  
      body: JSON.stringify({message: 'What is the meaning of post-life, the universe and everything?'})  
    })
    .then(response => response.json())  
    .then(function (data) {  

      console.log('POST response:', data);
      document.getElementById('post-response').innerHTML = JSON.stringify(data, null, 2);   
    })  
    .catch(function (error) {  
      console.log('Request failed', error);  
    });   
  }

  // Call them both;

  socketExample();
  postExample();
}
  </script>
</body>
</html>

Uwaga będziesz potrzebował dość najnowszej przeglądarki, takiej, która ma zarówno WebSocket, jak i API fetch dla tej części po stronie klienta, ale i tak jest nieistotna, to po prostu daje jej istotę.

 28
Author: Zlatko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-17 11:55:30