Sharing socket.io to other modules gives empty object
javascript, module, node.js, socket.io, sockets
Solution
Since, in `app.js`, you have:
exports.io = io;
then you would need to use it like so:
var app = require('../app');
var io = app.io;
That is you say, you attached a property called `io` to the module, so when you require that module, you get an object that has the `io` property set.
You could also do
module.exports = io;
and then leave `rss.js` as you have it now.
All that said, if you're running `app.js` with Node, you'll much more commonly see the `io` object injected into other modules (instead of the other way around); for example:
`app.js`
var express = require('express')
, app = express();
var server = require('http').createServer(app)
, io = require('socket.io').listen(server)
var routes = require('./routes')
, path = require('path')
, rss = require('./routes/rss')
// ...
rss(io); // pass `io` into the `routes` module,
// which we define later to be a function
// that accepts a Socket.IO object
`routes/rss.js`
module.exports = function(io) {
io.sockets.on('connection', function(
console.log("Connection on socket.io on socket");
// .. do stuff
});
}
Problem
I am trying to share `socket.io`'s socket object in different node.js modules although I fail and get empty object with ``` Cannot call method 'on' of undefined ``` My code : app.js ``` var express = require('express') , app = express(); var server = require('http').createServer(app) , io = require('socket.io').listen(server) var routes = require('./routes') , path = require('path') , rss = require('./routes/rss') // ... exports.io = io; ``` routes/rss.js ``` io = require(__dirname + '/../app'); console.log(io); io.sockets.on('connection', function( console.log("Connection on socket.io on socket"); // .. do stuff }); ``` That's the output I get from this : ``` $ node app.js info - socket.io started {} /home/XXX/programming/nodejs/node-express-aws/routes/rss.js:10 io.sockets.on('connection', function(socket){ ^ TypeError: Cannot call method 'on' of undefined at Object.<anonymous> (/home/XXX/programming/nodejs/node-express-aws/routes/rss.js:10:12) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/home/XXX/programming/nodejs/node-express-aws/app.js:9:10) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) ``` Although I have tried and I can do the same with `socket.io` only in one (app.js) file ``` var express = require('express') , app = express(); var server = require('http').createServer(app) , io = require('socket.io').listen(server) var routes = require('./routes') , path = require('path') , rss = require('./routes/rss') // ... io.sockets.on('connection', function(socket){ logger.debug("Connection on socket.io on socket"); socket.emit('news', {will: 'be recived'}); }); ```