javascriptnode.jssocketsexpresssocketcluster

Express server blocked with Sockets


I have a problem, I am mounting an express server with Sockets (module socketcluster-server) but when I am sending http requests the express is blocked after about 20 requests, causing the Sockets (client) to notify that they have run out Connection.

Has someone happened to you? Any ideas that can help me solve this problem?

Thank you

express.js

const http = require('http'),
 express = require('express'),
    socket = require('./socket'),
    HOST = 'localhost',
    PORT = 8000,
 bodyParser = require('body-parser');

const app = express()

const httpServer = http.createServer(app);

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get('/',(req,res)=>res.send({status:"ok"}))

socket.init(httpServer,HOST,PORT)

httpServer.listen(PORT,HOST);

httpServer.on('listening', () =>{
    console.log('Express server started on port %s at %s', httpServer.address().port, httpServer.address().address);
});

socket.js

const socketClusterServer = require('socketcluster-server')

module.exports = (() => {

    let scServer

    const createInstance = (httpServer, host, port) => {
        if (!scServer)
            scServer = socketClusterServer.attach(httpServer, {host, port});

        scServer.on('connection', function (socket) {
            console.log('socker: ', scServer.clientsCount)

            socket.on('client',getMessageByClient)

        })
    }

    const getMessageByClient = (data) => {
        if (data.channel)
            sendMessage(data.channel, data)
        scServer.removeListener('client', getMessageByClient)
    }

    const sendMessage = (channel, message) => scServer.exchange.publish(channel, JSON.stringify(message))

    const close = () => scServer.close()

    return {
        init: (httpServer, host, port) => createInstance(httpServer, host, port),
        sendMessage: (channel, message) => sendMessage(channel, message),
        close: () => close()
    }
})()

Solution

  • In the end after trying many ways, you will try to solve this problem as follows:

    // Environment variables
    const { env: { HOST, PORT }} = process
    
    //Create http server
    const httpServer = require('http')
    
    //Init express
    const express = require('express')
    const app = express()
    
    // Here would come express configurations and routes
    
    // Attach express to our httpServer
    httpServer.on('request', app)
    
    // Init socket with http server
    const socket = require('./socket')
    socket.init(httpServer, HOST)
    
    // Init http server
    httpServer.listen(PORT, HOST)
    
    httpServer.on('listening', async () => {
    
       console.info(`Server started on port ${httpServer.address().port} at ${httpServer.address().address}`)
    })
    

    Currently it is working correctly, it receives express requests and sockets without any blocking.

    I hope this can help someone.