Weblink Solutions
Weblink Solutions

Reputation: 13

Express-generator, Socket.io Event issuing multiple times

I have create a node app using express generator. I have integrated socket.io in the application. Since express generator has their own way of creating express server i have followed this procedure to successfully integrate the Socket connection with listening server and made the io available throughout the application via res.io instance.

FILE: bin/www

#!/usr/bin/env node
var app = require('../app').app;
var debug = require('debug')('www:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = require('../app').server;

/app.js

//Express handler
var app = express();
// Socket configuration
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.use(function(req, res, next){
  res.io = io;
  next();
});

...

module.exports = {app: app, server: server};

But the problem is when i m emitting an event as shown below. My client is reading the data multiple times.

routes/index.js

   var clients = 0;
   var nsp = res.io.of('/default-namespace');
    nsp.on('connection', function (socket) {
      clients++;
      console.log(clients + ' clients connected!');
      socket.on('disconnect', (reason) => {
        clients--;
        console.log(clients + ' clients connected!');
      });
         nsp.emit("socketToMe", "New User connected. Current clients:"+ clients);
    });

My listener has the following code: home.pug

 var socket = io('/default-namespace');
 socket.on('socketToMe', function (data) {
    $('#data-div').append($('<li>').text(data));
    });

Whenever i refresh the browser in another instance like incoginito my main browser is showing multiple events for the data. Like this

New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:1 

Not sure what is wrong. Can anyone help me on this?

Upvotes: 0

Views: 332

Answers (1)

Sumanth Reddy
Sumanth Reddy

Reputation: 304

Nodejs is event driven.The res object is not a global variable. Express middleware runs for every request.

   var clients = 0;
   var nsp = res.io.of('/default-namespace');
   nsp.on('connection', function (socket) {
     clients++;
     console.log(clients + ' clients connected!');
     socket.on('disconnect', (reason) => {
     clients--;
     console.log(clients + ' clients connected!');
     });
     nsp.emit("socketToMe", "New User connected. Current 
     clients:"+clients);
   });

Let me explain what happens above.A user requests and req handler is fired and you access the res object and you listen for events. So for each request, you are listening for socket 'connection' event.That means you are setting multiple event listeners with the same name.Every time you make a request you set a new listener.

You are supposed to set only a single 'connection' listener.

This explains emitting the same event multiple times.

app.use(function(req, res, next){
 res.io = io;
 next();
});

Instead of using the above middleware function,listen directly on io instance

Upvotes: 1

Related Questions