【问题标题】:how to organize socket handling in node.js and socket.io app如何在 node.js 和 socket.io 应用程序中组织套接字处理
【发布时间】: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

等等。等等

【问题讨论】:

    标签: node.js sockets websocket socket.io


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2013-06-12
      相关资源
      最近更新 更多