【问题标题】:Can I separate socket.io event listeners into different modules?我可以将 socket.io 事件侦听器分成不同的模块吗?
【发布时间】:2014-07-17 23:23:25
【问题描述】:

我正在处理超过 15 个不同的套接字事件,我想在与这些事件相关的模块中管理某些 socket.io 事件。

例如,我想让一个名为 login.js 的文件处理login 套接字事件,一个名为 register.js 的文件处理注册套接字事件。

index.js:

socket.on("connection", function (client) {

    console.log("Client connected to socket!");

    client.on("login", function (data) {

        validate(data){

            socket.sockets.emit("login_success", data);

        }

    });

    client.on("register", function (data) {

        register(data){

            socket.sockets.emit("register_success", data);

        }

    });

});

有没有办法可以将client.on("register", function (data) { ... 放在一个文件中,将client.on("login", function (data) { ... 放在另一个文件中?

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    我通常将各种与客户端相关的功能(我通常称它们为处理程序)拆分为单独的模块,然后 require 并在任何创建 socket.io 连接的文件中使用它们。

    这是一个示例模块,它导出了一个期望传递给 socket.io 客户端的函数:

    /* register-handler.js */
    module.exports = function (client) {
      // registration related behaviour goes here...
      client.on('register', function (data) {
        // do stuff
      });
    };
    

    由创建新套接字、侦听连接并将它们传递给处理程序的文件使用,然后处理程序侦听客户端上的事件。

    /*  main.js */
    // require your handlers
    var handleRegister = require('./register-handler');
    
    // .. set up socket.io
    
    socket.on('connection', function (client) {
      // register handlers
      handleRegister(client);
    });
    

    【讨论】:

      【解决方案2】:

      这是一种方法

      socket.on("connection", function (client) {
      
          console.log("Client connected to socket!");
      
          require('./login')(socket, client);
          require('./register')(socket, client);
      });
      

      login.js

      module.exports = function(socket, client) {
          client.on("login", function (data) {
      
              validate(data){
      
                  socket.sockets.emit("login_success", data);
      
              }
      
          });
      };
      

      【讨论】:

      • 我认为这是最好的答案。无论如何,接受的都没有错。但是,使用此解决方案,您可以简单地要求每个模块,它会处理其事件而不会阻塞“配置”区域。通过 WebSocket 的 CRUD 之类的东西,每个事件可以有 4 个以上的子事件。由于现代应用程序中有大量不同的资源,以前的解决方案可能会很快变得繁琐。
      【解决方案3】:

      很简单

      // export from your handler file:
      
      exports.myHandler = socket => data => { // the socket object is available due to closure }
      
      // import in your socket app.js file
       
      import { myHandler } from './handlers/mySocketHandler'
       
      // now just call the myHandler function.
      // pass the socket object from the app.js file and it will return a handler function
      
      socket.on('message', myHandler(socket))
      

      【讨论】:

      • 这是一个可行的解决方案,但它需要进一步改进以显示来自诸如 messageBody 之类的事件的有效负载的情况。
      【解决方案4】:

      创建一个侦听器文件夹,将所有事件处理程序放在单独的文件中,然后通过一些技巧您可以包含所有这些侦听器。

      在监听器/index.js 中:

       module.exports = (io) => {
       const fs = require('fs');
       const path = require('path');
       const listenersPath = path.resolve(__dirname);
       io.on('connection', (socket) => {
          fs.readdir(listenersPath, (err, files) => {
            if (err) {
              process.exit(1);
            }
            files.map((fileName) => {
              if (fileName !== 'index.js') {
                require(path.resolve(__dirname, fileName))(io, socket);
              }
            });
          });
        });
      };
      

      然后在不同的文件中,你可以处理监听器。

      监听器/login.js:

        module.exports = (io, socket) => {
            socket.on('login', (data) => {
              // handle the event
            });
        }
      

      在您的 app.js 文件中:

      const initListeners = require('./listeners/index');
      
      const server = app.listen(3000);
      const io = require('socket.io')(server);
      initListeners(io);
      

      您也可以对事件发射器执行此操作。

      【讨论】:

        【解决方案5】:

        是的,您可以使用 exportsrequire

        签出this

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-22
          • 1970-01-01
          相关资源
          最近更新 更多