Hayk Aramyan
Hayk Aramyan

Reputation: 323

Express - how use io.socket.emit in route files?

I have an app with express (nodeJS).

Want to emit io.socket when write some data on DB, so need to emit in route file (ex. /routes/save.js)

this is my app.js

var express = require('express');
var save = require('./routes/save');
var http = require('http');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
......
io.on('connection', function(socket){
    socket.on('newTweet', function(msg){
        io.emit('newTweet', msg);
    });
});

app.use('/save', save);
.....
module.exports = app;
server.listen(3000, function () {
    var host = server.address().address
    var port = server.address().port
})

Can you please help me to write io.socket.emit('event') in /routes/save.js ?

Upvotes: 1

Views: 3191

Answers (3)

Julien
Julien

Reputation: 1

import {createServer} from 'http';
import express from 'express';
import socketio  from 'socket.io';

const server = createServer(app);
const io = socketio.listen(server);

app.use(function (req, res, next) {
    req.io = io;
    next();
})
app.get('/', function (req, res) {
   const ioConnection = req.io;
   ioConnection.emit('nouveau_client', body.pseudo);
});
io.sockets.on('connection', function (socket) {
    socket.on('nouveau_client', function (user) {
       socket.broadcast.emit('nouveau_client', user.pseudo);
   });
});
server.listen(3000);

Upvotes: 0

Hirad Roshandel
Hirad Roshandel

Reputation: 2187

You can just pass the io object to your routes like this:

var app = express();
var io           = socket_io();
app.io           = io;

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

Upvotes: 0

Hayk Aramyan
Hayk Aramyan

Reputation: 323

I found a way.

Before app.use('/save', save); needed to write following code in app.js

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

and after this get io from req parameter in save.js for example

var express = require('express');
var router = express.Router();

router.post('/', function(req, res, next) {
    .....
    var io = req.io;
    io.emit('newTweet', 'test');
    .....
});

module.exports = router;

if you know better way than this one, please let me know.

Upvotes: 4

Related Questions