Javascript 如何使用socket.io在多个模块中定义侦听器

Javascript 如何使用socket.io在多个模块中定义侦听器,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,半年前,我用node.js和socket.io编写了一个小型多人游戏。现在我正在尝试改进它,我的改进之一是将代码分解成模块,顺便说一句,我使用的是expressjs 4.4和socket.io 1.0。我有一个玩家队列,处理连接玩家的顺序。一切都很顺利,直到我被socket卡住。io:我想处理玩家队列中的断开连接侦听器,同时我想将所有与游戏相关的侦听器放在我的游戏模块中。我尝试了几件事,包括,但没有一件是我带去工作的。当前我正在从以下位置传递io对象: io = require("socket.

半年前,我用node.js和socket.io编写了一个小型多人游戏。现在我正在尝试改进它,我的改进之一是将代码分解成模块,顺便说一句,我使用的是expressjs 4.4和socket.io 1.0。我有一个玩家队列,处理连接玩家的顺序。一切都很顺利,直到我被socket卡住。io:我想处理玩家队列中的断开连接侦听器,同时我想将所有与游戏相关的侦听器放在我的游戏模块中。我尝试了几件事,包括,但没有一件是我带去工作的。当前我正在从以下位置传递io对象:

io = require("socket.io")(server);
我错过什么了吗

我的代码:

PlayerManager.js

为了完整性:

客户端的index.js

define(["socketio"], function(io) {
    var socket = io("/player");

    socket.on("blub", function() {
        console.log("blub");
    });

    setInterval(function() {
        socket.emit("blub");
    }, 1000);
});

一年后,是时候清理和分享我在这段时间里获得的见解了


让socket.io相关的代码散布在整个项目中是一种糟糕的设计,或者是来自任何其他库的代码。如果必须更改包装器库,则必须在代码库的许多地方进行更改。更好的方法是将socket.io的使用限制在一个很薄的层上,在该层上完成与WebSocket之间的所有通信。从那以后,你将使用另一层信息:你自己的。Node.js自己的EventEmitter是完成这项工作所需的一切。

与此同时,我会做一些不同的事情:将代码拆分为模块。您可能已经这样做了,但与其引用其他模块,不如通过消息传递(例如与EventEmitter)与它们通信。这会导致模块之间的低耦合。然后在socket.io-stuff周围写一个薄薄的包装。例如:将socket.io相关代码放入模块中。当你收到某物时。在“无论什么”上,fn;在socket.io处理程序的回调函数中,您将立即通过事件发射器将其转发到相应的模块。
var log = require("npmlog");
var config = require("./config");
var Duck = require("./Model/Duck").Duck;

var Game = (function() {
    var self;

    function Game(eventEmitter, io, players) {
        log.info("Game", "loading ...");

        self = this;

        this.io = io;
        this.eventEmitter = eventEmitter;
        this.players = players;

        setInterval(function() {
            self.io.to("players").emit("blub");
        });

        // ...

    return Game;
})();

exports = module.exports = Game;
define(["socketio"], function(io) {
    var socket = io("/player");

    socket.on("blub", function() {
        console.log("blub");
    });

    setInterval(function() {
        socket.emit("blub");
    }, 1000);
});