【问题标题】:Structuring Modules and socket.io in node.js在 node.js 中构建模块和 socket.io
【发布时间】:2014-07-26 19:59:05
【问题描述】:

我似乎对如何构建节点模块缺乏了解。

我在app.js 中有以下内容。

var io = require('socket.io')(http);
io.on('connection', function(socket){

    socket.on('disconnect', function(){
        console.log('user disconnected');
    });

    console.log("New user " + socket.id);
    users.push(socket.id);
    io.sockets.emit("user_count", users.length);
});

这很好。我可以对来自客户端的各种消息做出反应,但我也有几个模块需要对不同的消息做出反应。例如我的cardgame.js 模块应该对:

socket.on("joinTable"...
socket.on("playCard"

虽然我的chessgame.js 应该做出反应

socket.on("MakeAMove"...

和我的 user.js 文件句柄:

socket.on('register' ...
socket.on('login' ...

我将如何链接/构造我的文件以处理这些不同的消息,以便我的对套接字请求做出反应的文件不会变得太大。

基本上,如果我可以将套接字对象传递给这些模块,那就太好了。但问题是,在建立连接之前,套接字将是未定义的。

另外,如果我将整个 io 变量传递给我的模块,那么这些模块中的每一个都会有 io.on('connection',..) 调用。不确定这是否可能或需要。

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    你不需要传递整个 io 对象(但你可以,我这样做以防万一我需要它)。只需将套接字传递给连接时的模块,然后为模块设置特定的on 回调

    主要

    io.on("connection",function(socket){
        //...
        require("../someModule")(socket);
        require("../smoreModule")(socket);
    });
    

    插座

    //Convenience methods to setup event callback(s) and 
    //prepend socket to the argument list of callback
    function apply(fn,socket,context){
        return function(){
            Array.prototype.unshift.call(arguments,socket);
            fn.apply(context,arguments);
        };
    }
    
    //Pass context if you wish the callback to have the context
    //of some object, i.e. use 'this' within the callback
    module.exports.setEvents = function(socket,events,context){
        for(var name in events) {
            socket.on(name,apply(events[name],socket,context));
        }
    };
    

    someModule

    var events = {
        someAction:function(socket,someData){
    
        },
        smoreAction:function(socket,smoreData){
    
        }
    }
    
    module.exports = function(socket){
       //other initialization code
       //...
    
       //setup the socket callbacks for the connected user
       require("../socket").setEvents(socket,events);
    };
    

    【讨论】:

    • 这看起来像我想要的。尽管需要多个套接字,但我将如何处理模块?我假设先创建对象,然后简单地使用 addSocket 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2013-10-10
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多