如何在 node.js 和 socket.io 应用程序中组织套接字处理

Posted

技术标签:

【中文标题】如何在 node.js 和 socket.io 应用程序中组织套接字处理【英文标题】:how to organize socket handling in node.js and socket.io app 【发布时间】:2013-12-26 07:07:46 【问题描述】:

对于我的 REST api,我为每条路由创建了一个文件。

app.get('/api/user', routes.user.index);
app.get('/api/user/login', routes.user.login);

等等等等

现在我将 socket.io 引入后端,看来我只能为所有套接字事件调用一个函数。

var socket = require('./socket/stuff.js');

io.sockets.on('connection', function(sock)
    socket.stuff(sock, io);
);

我应该如何分解./socket/stuff.js 文件(导出stuff)。放入单独的文件中。我想最终用套接字替换我的 REST api,但我不希望所有内容都在一个文件中。

我想我会:

./socket/chat.js
./socket/user.js

等等。等等

【问题讨论】:

【参考方案1】:

要将您的事件处理程序组织在不同的文件中,您可以使用如下结构:

./main.js

var io = require('socket.io');
var Chat = require('./EventHandlers/Chat');
var User = require('./EventHandlers/User');

var app = 
    allSockets: []
;

io.sockets.on('connection', function (socket) 

    // Create event handlers for this socket
    var eventHandlers = 
        chat: new Chat(app, socket),
        user: new User(app, socket)
    ;

    // Bind events to handlers
    for (var category in eventHandlers) 
        var handler = eventHandlers[category].handler;
        for (var event in handler) 
            socket.on(event, handler[event]);
        
    

    // Keep track of the socket
    app.allSockets.push(socket);
);

./EventHandlers/Chat.js

var Chat = function (app, socket) 
    this.app = app;
    this.socket = socket;

    // Expose handler methods for events
    this.handler = 
        message: message.bind(this) // use the bind function to access this.app
        ping:    ping.bind(this)    // and this.socket in events
    ;


// Events

function message(text) 
    // Broadcast message to all sockets
    this.app.allSockets.emit('message', text);
);

function ping() 
    // Reply to sender
    this.socket.emit('message', 'PONG!');
);

module.exports = Chat;

【讨论】:

对于示例套接字事件处理程序,chat.js 会是什么样子? 我最终做了类似的事情。但我只是调用require('./sockets').register(sock, io),它有一个函数调用./chat.js./user.js 导出的register 函数【参考方案2】:

index.js

const httpServer = require("http").createServer();
const io = require("socket.io")(httpServer);

const registerOrderHandlers = require("./orderHandler");
const registerUserHandlers = require("./userHandler");

const onConnection = (socket) => 
  registerOrderHandlers(io, socket);
  registerUserHandlers(io, socket);


io.on("connection", onConnection);

orderHandler.js

module.exports = (io, socket) =>   const createOrder = (payload) =>     // ...  
  const readOrder = (orderId, callback) =>     // ...  
  socket.on("order:create", createOrder);  socket.on("order:read", readOrder);

我从文档中得到它。 https://socket.io/docs/v4/server-application-structure/

【讨论】:

以上是关于如何在 node.js 和 socket.io 应用程序中组织套接字处理的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Socket.IO 聊天应用集群服务器

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

如何使用 Socket.io 和 Node.js 开发大型聊天应用程序 [关闭]

如何在 Node.js 中从请求参数获取经过身份验证的用户到 socket.io

如何使用 node.js 和 socket.io 将文件从 iPhone 发送到另一台 iPhone?

如何实现socket.io的生存时间