【问题标题】:encapsulate a socket.io instance in nodejs在 nodejs 中封装一个 socket.io 实例
【发布时间】:2012-11-23 10:40:12
【问题描述】:

我正在尝试在模块中封装 socket.io 实例。我这样做了,但它看起来有点乱,因为我必须注入一些依赖项来验证来自 express/passport 的套接字传输。

我的问题是我想访问模块外部的套接字实例,例如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;

【问题讨论】:

    标签: node.js module socket.io


    【解决方案1】:

    我建议,下面的灵活性和可扩展性很好。我已经尝试了这两种方法并导致使用多个连接事件。

    我想过做 sio.on('connection', function(socket) {});模块外。也许我可以做两次,首先在模块内部,然后在外部,但我会创建 我猜是两个听众。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2014-10-31
      • 2011-07-16
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多