10

我正在尝试将我的 socket.io 代码与我的主文件(app.js)分开到一个单独的文件(socket.js)中。但是,我需要在 app.js 中定义我的 io 对象,该对象也在我的 socket.js 文件中使用。

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

应用程序.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
}
4

2 回答 2

19

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

另一种方法是创建一个新文件,比如“global.js”。仅将您希望全局化的那些项目放在此文件中。例如

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

现在,在你的 app.js 中,

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

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

在你的 socket.js 中:

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

希望能帮助到你...

于 2013-04-01T03:26:06.410 回答
11

应用程序.js

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

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

socket(io)

socket.js

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

  });
}
于 2013-04-01T02:32:28.820 回答