Ravioli87
Ravioli87

Reputation: 835

Socket.io with Express, emit not working within express route

Either I have a fundamental misunderstanding of how socket.io works (highly likely), or I am just finding some bug that nobody knows about (nearly impossible).

I've been trying to integrate express with socket.io. On the client side, everything works fine: user clicks button, event emits, everybody's happy.

However, let's say I want to emit this event from within an express route before rendering a page. The event never seems to be emitted. From all the questions on this that I've looked at, I'm supposed to be able to simply plug my "io" instance into my app and then access it from within my routes.

So this is my setup...

// index.js

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

var io = require('socket.io').listen(app.listen(port));
io.on('connection', function (socket) {
    console.log("Socket connected on port " + port)

    socket.on('send', function (data) {
        console.log("WAFFLES")
    });
});
console.log('The magic happens on port ' + port);

require('./app/routes.js')(app, io);

// app/routes.js

module.exports = function(app, io){

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

    io.on('connection', function (socket) {
        console.log("Hello from the route!")
        socket.emit('send', {message: 'urdum'})
    });

    res.render('index')
  })
}

So in this instance, I want to be able to go into the / route, see "Hello from the route" and then "WAFFLES" logged to the console after emitting the "send" event. Instead I get absolutely nothing.

I've tried to pass in "io" via app.set('socketio', io). But no matter what, nothing works.

I've also tried emitting the event within the route without the io.on('connection') and simply just doing

io.emit('send' ...)

OR

io.sockets.emit('send' ...)

Upvotes: 1

Views: 2700

Answers (1)

Medet Tleukabiluly
Medet Tleukabiluly

Reputation: 11930

I have a fundamental misunderstanding of how socket.io works (highly likely)

You are right,

This is typical setup for socket-io, read more in https://socket.io/docs/

// index.js

var express = require('express');
var socketio = require('socket.io');
var http = http = require('http');
var app = express();

// Attach Socket.io
var server = http.createServer(app);
var io = socketio.listen(server);
app.set('socketio', io); // <-- bind socket to app
app.set('server', server); // <-- optional
io.on('connection', function (socket) {
    console.log("Socket connected on port " + port);
});
app.listen(3000);
server.listen(3001) // <-- socket port
// app.get('server').listen(3001); // <-- use server or app.get('server')

In your router, access socket by req.app.get('socketio');

// app/routes.js
module.exports = function(app, io){

  app.get('/', function(req, res){
    var socketio = req.app.get('socketio');

    socketio.emit('send', {message: 'urdum'});

    res.render('index')
  })
}

Upvotes: 1

Related Questions