我正在尝试封装模块中的socket.io实例。我做了这个,但它看起来有点乱,因为我必须从快递/护照注入一些依赖关系来验证套接字传输。
我的问题是我想访问模块之外的套接字实例,如socket.on("newDevice", function (data) {});
我通过连接事件获得的套接字实例位于函数内部,甚至在创建时也可能不存在,因为没有建立连接。这对我来说简直是错误的。我不想注入越来越多的依赖项,因为我需要它们在函数范围内。
我考虑过在模块之外做sio.on('connection', function(socket) {});
。也许我可以做两次,首先在模块内部,然后在外面,但我想创建两个听众。
有没有好的做法或模式如何正确地做到这一点?
var io = require('socket.io');
var socket = function (server, sessionStore, cookieParser, authentication) {
var sio = io.listen(server);
// Configure socket.io
sio.configure(function () {
// Authorize the socket.io request
sio.set('authorization', function (data, accept) {
// Authorization is done here
});
});
sio.on('connection', function(socket) {
var lastActionTime = new Date();
// Get the userId from the session
var session = socket.handshake.session;
var userId = session.passport.user;
var sessionID = socket.handshake.sessionID;
var userdata = null;
// Deserialize user by the userId
authentication.deserializeUser(userId, function(err, user) {
// get the userdata
});
socket.on('disconnect', function() {
});
socket.on('brightnessChange', function(data) {
// TODO Do something here device control
// Broadcast to other devices
this.broadcast.emit('brightnessChange', data);
});
});
return sio;
};
module.exports = socket;
答案 0 :(得分:-1)
我建议,以下,灵活性和规模很好。我尝试了两种方式并导致使用多个连接事件。
我考虑过做sio.on('connection',function(socket){});在模块之外。也许我可以做两次,首先在模块内部,然后在外面,但我会创建 我猜两个听众。