Node.js - Socket.io - 如何最佳地组织 socket?

4

我从未使用过socket.io,想知道在我的模型中该如何构建它,目前我的计划是创建一个名为Socket的类和另一个名为Model的类,后者可派生用于例如UserModel

然后,在UserModel.authenticate()中,我会调用Socket将用户添加到某个房间。

我只是想知道这是否可行,或是否应该遵循某种设计模式,或者我的设计是否有误。(没有socket方面的经验,所以最好向有经验的人请教!)

如果你知道更好的方法或示例,请让我知道,我认为它很简单,但我可能会错。

1个回答

3
你试图实现的听起来像是 外观模式,旨在抽象出套接字的机制。
在我看来,这种实现可能非常困难,因为你必须对套接字进行很好的抽象。我的方法完全不同,我会通过聚合和责任来分组套接字。比如说,我有一个套接字文件,仅用于用户交互,其他用于管理活动流(在社交网络中)或管理产品等。可以将它们视为MVC模式中的控制器。
要将套接字分离到不同的物理文件中,可以通过以下方式管理事件处理程序:
io.of('namespace').on('connection',function(socket){
    var eventHandlers = {
        'user': new userLib.UserSocket(socket, app),
        'document': new documentLib.documentSocket(socket,app)
    };
    for (var category in eventHandlers) {
        var handler = eventHandlers[category].handlers;
        for (var event in handler) {
        socket.on(event, handler[event]);
        }
    }
    socket.on('error',function(err){
        console.error(err);
    });
    socket.on('disconnect',function(){
         console.log('disconnect');
    });

}

在您的用户事件处理程序文件中(例如user.socket.js):
var signup = function(){
    var self = this; 
    //TODO: do your code
};

var authenticate = function(){
var self = this; 
    //TODO: do your code
}

exports.UserSocket = function(socket,app){
    this.app = app;
    this.socket = socket;

    this.handlers = {
        authenticate:authenticate.bind(this),
        signup: signup.bind(this)
    };
};

希望这有所帮助!

有趣,我也考虑过这个问题,我正在使用TypeScript,因此经常使用面向对象编程,使用这种模式确实非常有意义(我已经在控制器、模型和我的API中实现了它),我会将真正的逻辑写在API中,并由控制器、套接字和模型使用,因此逻辑只需编写一次即可重复使用。我会采用这种方式,谢谢! - Vadorequest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接