javascript - 在node.js中构建模块和socket.io

标签 javascript node.js socket.io

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

我在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);
});

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

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

而我的chessgame.js应该使用react

socket.on("MakeAMove"...

我的 user.js 文件句柄:

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

我如何链接/构造我的文件来处理这些不同的消息,以便我的对套接字请求使用react的文件不会变得太大。

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

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

最佳答案

你不需要传递整个 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));
    }
};

某些模块

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);
};

关于javascript - 在node.js中构建模块和socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24970087/

相关文章:

node.js - Socket.io错误: listen EADDRINUSE

javascript - 匹配 jquery 中的确切属性名称

javascript - Vorpal - 如何使用提示执行命令

javascript - 使用jquery如何调用一个函数并在函数执行完成时从上一个函数调用另一个函数

node.js - 在 node.js 中使用 node-fetch 重用 TCP 连接

node.js - 是否可以在 Apollo 模拟中传递参数?

javascript - NodeJS,Express与Socket.io交互

node.js - 错误视频流socket.io + socket.io-stream(超出最大调用堆栈大小)

javascript - TypeScript 通过 tsc 命令 : Output to single file without concatenation

javascript - 将 Visual Studio 2012 JavaScript Intellisense 标记移动到单独的文件