Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sharing variables across files in node.js without using global variables

I'm trying to separate my socket.io code into a separate file (socket.js) from my main file (app.js). However, I need to define my io object in app.js, which is also used in my socket.js file.

Currently, I set io as a global variable so it is accessible from app.js (Global Variable in app.js accessible in routes?), but I understand this is bad practise. Is there a better way to do this (can injection work in this case, as I need to export a variable from the app.js to socket.js rather than the other way round)? Thank you!

app.js

var app = express(),
  server = require('http').createServer(app);

//KIV -> io is set as a global variable
io = require('socket.io').listen(server);
require('./socket');

socket.js

io.sockets.on('connection', function(socket) {
    //xxx
}
like image 857
Dan Tang Avatar asked Apr 01 '13 02:04

Dan Tang


1 Answers

One of the ways is by passing the object as argument to function (as already has been described in @Thomas' answer).

Other way is to create a new file say 'global.js'. put only those items in this file that you want to be global. e.g.

var Global = {
    io : { }
};    
module.exports = Global;

Now, in your app.js,

var app = express(),
    server = require('http').createServer(app), 
    global = require('./global.js');

global.io = require('socket.io').listen(server);
require('./socket');

And in your socket.js:

var global = require('./global.js');
global.io.sockets.on('connection', function(socket) {
    //xxx
}

Hope it helps...

like image 77
jsist Avatar answered Sep 30 '22 13:09

jsist