Настройка вебсокетов NodeJS для HTTP & HTTPS

Dec 25, 2019 in JS, Бэкенд

Содержание

Админу на хлеб с маслом - 50 руб.

Список запросов, через которые пришло решение проблемы

  • Mixed Content: The page at '' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ''. This request has been blocked; the content must be served over HTTPS.
  • websocket node http https net::ERR_CERT_SYMANTEC_LEGACY
  • WebSocket Error in connection establishment: net::ERR_CONNECTION_CLOSED
  • failed: Error in connection establishment: net::ERR_CONNECTION_RESET
  • Failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
  • websocket https не работает
  • Перестал работать Websocket после перехода на HTTPS. Чего менять?
  • Https server with websockets on node.js
  • How to setup route for websocket server in express?

HTTP

const express = require('express');
const app = express();

const serverHttp = require('http').createServer(app);

const ioHttp = require('socket.io')(serverHttp);

// create the connection to database
const mysql = require('mysql2');
const connection = mysql.createConnection({
    host: '127.0.0.1',
    user: 'user_DB', 
    database: 'name_DB', 
    password: 'pass_DB', 
});

const cfg = {
    port_http: 4000,
    interval: 1000,    
};

serverHttp.listen(cfg.port_http, function(){
    console.log('HTTP: Run server NodeJS. Listening on port ' + cfg.port_http);
});

setInterval( function() {
    var info = new Date();
    ioHttp.emit('anybody', info);
}, cfg.interval);

ioHttp.on('connect', function(socket){

    socket.on("quantity_product", function (data) {
        var sqlQuantity = connection.query("UPDATE `b_sale_basket` SET `QUANTITY` = "+data.quantity+" WHERE `ID` = "+data.id+" AND `FUSER_ID`="+data.fuser_id+" ");
    });

    console.log(' <=== Connected! ===> ');

    socket.on('disconnect', function(){
        console.log(' ===    OFF     === ');
    });

});

HTTPS

const fs = require('fs');

const express = require('express');
const app = express();

const options = {
    key: fs.readFileSync('/etc/pki/tls/certs/certificate.key'),
    cert: fs.readFileSync('/etc/pki/tls/certs/certificate.crt'),
};

const serverHttps = require('https').createServer(options, app);

const ioHttps = require('socket.io')(serverHttps);

const cfg = {
    ssl: true,
    port_https: 2000,
    interval: 1000,    
};

// create the connection to database
const mysql = require('mysql2');
const connection = mysql.createConnection({
    host: '127.0.0.1',
    user: 'user_DB', 
    database: 'name_DB', 
    password: 'pass_DB', 
});

global.fuser_id = null;

serverHttps.listen(cfg.port_https, function(){
    console.log('HTTPS: Run server NodeJS. Listening on port ' + cfg.port_https);
});

/* HTTPS */

// тест работы вебсокетов с функцией date()
// проверка работоспособности соединения
setInterval( function() {
    var info = new Date();
    ioHttps.emit('anybody', info);
}, cfg.interval);

// контроллер операций с вебсокетами
ioHttps.on('connect', function(socket){

    // обновление данных наличия товара в корзине - частный случай применения вебсокетов
    socket.on("quantity_product", function (data) {
        console.log(data.fuser_id);
        // console.log(fuser_id);
        var sqlQuantity = connection.query("UPDATE `b_sale_basket` SET `QUANTITY` = "+data.quantity+" WHERE `ID` = "+data.id+" AND `FUSER_ID`="+data.fuser_id+" ");
    });

    console.log(' <=== Connected! ===> ');

    socket.on('disconnect', function(){
        console.log(' ===    OFF     === ');
    });

});