Nyxynyx
Nyxynyx

Reputation: 63619

socket.send outside of io.sockets.on( )

I have a loop that querys a database continuously. When the query returns a result, the node.js app will send a message to every client connected to the node server via socket.io v0.8.

Problem: io.sockets.broadcast.send('msg') is called in the middle of a setInterval() loop so it is not within an io.sockets.on()'s callback function and thus this will not work. When io.sockets.send('msg') is used, no message seems to be sent to the client.

Node.js code

setInterval(function() {
    util.log('Checking for new jobs...');
    dbCheckQueue(function(results) {
        if (results.length) {
            io.sockets.broadcast.send('hello');
        }
    });
}, 10*1000);

However, if the setInterval is to be called from within io.sockets.on('connection',..), every connected client will create an additional loop!

Node.js code

io.sockets.on('connection', function(socket) {
    setInterval(function() {
        util.log('Checking for new jobs...');
        dbCheckQueue(function(results) {
            if (results.length) {
                io.sockets.send('hello');
            }
        });
    }, 10*1000);
});

Clientside JS

        socket.on('hello', function() {
            console.log('HELLO received');
        })

*How can I get a SINGLE loop to run, but still be able to send a message to all connected clients?

Upvotes: 28

Views: 16902

Answers (2)

Vamoss
Vamoss

Reputation: 925

Improving previous answer from @Nyxynyx

io.sockets.emit('hello')

It is equivalent to:

io.of('/').emit('hello');

If you need a different route, change the of function parameter.

Documentation: https://socket.io/docs/v3/server-api/index.html#server-sockets

Upvotes: 2

Nyxynyx
Nyxynyx

Reputation: 63619

I think that this will successfully solve your problem

io.sockets.emit('hello')

Upvotes: 40

Related Questions