在不使用全局变量的情况下在node.js中的文件之间共享变量

Dan*_*ang 8 node.js express socket.io

我正在尝试将我的socket.io代码分离到我的主文件(app.js)中的单独文件(socket.js).但是,我需要在app.js中定义我的io对象,这也用在我的socket.js文件中.

目前,我将io设置为全局变量,因此可以从app.js访问(app.js中的全局变量可以在路由中访问?),但我知道这是不好的做法.有没有更好的方法来做到这一点(在这种情况下可以注入工作,因为我需要将变量从app.js导出到socket.js而不是相反)?谢谢!

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');
Run Code Online (Sandbox Code Playgroud)

socket.js

io.sockets.on('connection', function(socket) {
    //xxx
}
Run Code Online (Sandbox Code Playgroud)

jsi*_*ist 16

其中一种方法是将对象作为参数传递给函数(正如在@Thomas的回答中已经描述的那样).

另一种方法是创建一个名为'global.js'的新文件.只将这些项目放在您希望成为全局的文件中.例如

var Global = {
    io : { }
};    
module.exports = Global;
Run Code Online (Sandbox Code Playgroud)

现在,在你的app.js中,

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

global.io = require('socket.io').listen(server);
require('./socket');
Run Code Online (Sandbox Code Playgroud)

在你的socket.js中:

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

希望能帮助到你...


Tho*_*aum 11

app.js

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

var io = require('socket.io').listen(server);

socket(io)
Run Code Online (Sandbox Code Playgroud)

socket.js

module.exports = function (io) {
  io.sockets.on('connection', function(socket) {
    //..

  }
}
Run Code Online (Sandbox Code Playgroud)