我正在尝试将socket.io代码从我的主文件(app.js)中分离为单独的文件(socket.js)。但是,我需要在app.js中定义我的io对象,这也用在我的socket.js文件中。
目前,我将io设置为全局变量,因此可以从app.js(Global Variable in app.js accessible in routes?)访问它,但我知道这是不好的做法。有没有更好的方法来做到这一点(在这种情况下可以注入工作,因为我需要将变量从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');
socket.js
io.sockets.on('connection', function(socket) {
//xxx
}
答案 0 :(得分:16)
其中一种方法是将对象作为参数传递给函数(如@Thomas的回答中所述)。
其他方法是创建一个名为'global.js'的新文件。只将这些项目放在您希望成为全局的文件中。 e.g。
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
}
希望它有所帮助...
答案 1 :(得分:11)
app.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) {
//..
}
}