Sunday, June 2, 2024
 Popular · Latest · Hot · Upcoming
187
rated 0 times [  190] [ 3]  / answers: 1 / hits: 22575  / 7 Years ago, fri, december 15, 2017, 12:00:00

I have express/nodejs api. I am adding socket.io feature to it. Currently all of my routes are in separate folders and I include them in server.js file and use them as app.use() function.



In server.js file, I also start the express server by listening to a particular port such as 3000 as below.



let server = app.listen(3000);


According to all google searches what I found is that I need to pass server variable to initialize socket.io like following.



let io = require('socket.io')(server);


Now the question is that since it needs this variable then how can I use socket.io in my routes files which are in different folder to emit and receive events from client?



UPDATE



in server.js file



let route = require('./routes/route');

let app = express();

let server = app.listen(3000);

console.log('Listening to port');

let io = require('socket.io')(server);

app.use('/api/1.0/events', route(io));


in route.js file



let express = require('express');

module.exports = (io) => {
console.log('IO: ', io);
};


UPDATE 2



server.js file



let express = require('express');
let events = require('./routes/events');
let app = express();
let server = app.listen(3000);

let io = require('socket.io')(server);


app.use(function(request, response, next) {
request.io = io;
next();
});

app.use('/events', events);


events.js file



let express = require('express');

let Events = require('../models/events');

apiRoutes.post('/new', function(request, response) {
let newEvent = new Events(request.body);

newEvent.save((error, result) => {
if (error) {
response.json(error);
} else {
// console.log('ELSE');
// request.io.on('connect', socket => {
// console.log('LISTENING TO SOCKET...');

request.io.on('EventCreated', data => {
console.log('DATA ON Server: ', data);
});
// });

response.json({
success: true,
message: 'New event created'
});
}
});
});

More From » node.js

 Answers
22

There are multiple ways to share the io variable with route files.




  1. When you require() in your route file, pass it the io variable as a constructor argument.


  2. Use app.set(io, io) so you can then use let io = app.get(io) in any file that has access to the app object.


  3. Create a middleware that puts the io object on every req object so you can access it from there any time.







Here's an example of passing it as a constructor argument to the router file:



let server = app.listen(3000);
let io = require('socket.io')(server);

// load other routers
app.use(require(./someRouterFile.js)(io));

// in someRouterFile.js
const express = require('express');

module.exports = function(io) {
let router = express.Router()

// define routes
// io is available in this scope
router.get(...)

return router;
}





Here's an example of the app.set() scheme:



let server = app.listen(3000);
let io = require('socket.io')(server);
app.set(io, io);


Then, anywhere in your routes that you have access to the app object, you can get it with:



let io = app.get(io);





Here's an example of using a middleware to set the io object onto every req object so it's available from all routes.



let server = app.listen(3000);
let io = require('socket.io')(server);

// place this middleware before any other route definitions
// makes io available as req.io in all request handlers
app.use(function(req, res, next) {
req.io = io;
next();
});

// then in any express route handler, you can use req.io.emit(...)





Here's an example of using an argument to the module constructor without middleware:



// in mysocket.js
module.exports = (io) => {
console.log('IO: ', io);
io.on('connect', socket => {
// handle various socket connections here
});

// put any other code that wants to use the io variable
// in here


};


Then, in your main file:



let server = app.listen(3000);
let io = require('socket.io')(server);

// initialize my socketio module and pass it the io instance
require('./mysocket.js')(io);

[#55670] Wednesday, December 13, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
americar

Total Points: 631
Total Questions: 107
Total Answers: 103

Location: Luxembourg
Member since Tue, Jan 25, 2022
2 Years ago
;