提问者:小点点

在Node和Express中分离套接字IO调用更干净的代码


所以,我在做一个应用程序,我已经让套接字IO工作,这个应用程序只在Express上运行。

总之,在主服务器文件中是我执行呼叫的地方。一些例子:

//Object 1
io.of('/type1').on
(   'connection', socket => 
{   socket.on
    (   'call1', () =>
        {   doSomething1();
        }
    );
}
);

// Object 2
io.of('/type2').on
(   'connection', socket => 
{   socket.on
    (   'call2', () =>
        {   doSomething2();
        }
    );
}
);

显然,有更多的socket.on调用各种对象。我实际上想要做的是将这些对象的逻辑从主循环中分离到一些单独的文件中,以便更好地清理我所拥有的主server.js文件。我有大约300行不同的套接字调用。

类似对象1的SocketCalls1.js等。

唯一的问题是io变量似乎不能在多个文件之间共享。。。有没有一个好的,干净的方法来做这件事?


共1个答案

匿名用户

唯一的问题是io变量似乎不能在多个文件之间共享。。。

这不是真的。您可以将IO变量传递到函数中或传递到模块外,就像任何其他变量一样。同样,与任何其他变量一样,它自动地被私有地限定到单个文件中。

有几种方法可以跨文件共享对象,如果您已经做到了这一点,我相信您已经使用了其中的大多数方法。只是也许你可能没有意识到你一直在做什么。

拆分逻辑的一种方法是将其拆分到几个模块上。因为可以将对象传递到函数中,所以模块应该导出函数。例如:

>

  • file1:type1.js

    function init (io) {
      io.of('/type1').on
      (   'connection', socket => 
      {   socket.on
          (   'call1', () =>
              {   doSomething1();
              }
          );
      }
      );
    }
    
    module.exports = init;
    

    文件2:type2.js

    function init (io) {
      io.of('/type2').on
      (   'connection', socket => 
      {   socket.on
          (   'call2', () =>
              {   doSomething2();
              }
          );
      }
      );
    }
    
    module.exports = init;
    

    main.js

    const type1 = require('./path/to/type1.js');
    const type2 = require('./path/to/type2.js');
    
    // some code to init your app ...
    
    type1.init(io); // pass io to type1 module
    type2.init(io); // pass io to type2 module
    

    这是因为IO只是一个常规变量。就像任何变量一样,可以将它作为函数参数传递。这里没有什么是花哨的,这是编程语言的所有基本特性。

    另一种技术是特定于模块如何在Node.js中工作的。模块是节点中的单例。这意味着一个模块正好代表一个对象。如果3个不同的文件需要()s模块,它们将获得相同的对象。

    我们可以使用它在模块之间共享IO对象:

    >

  • 文件1:server-init.js

    let app = require('express')();
    let http = require('http').Server(app);
    let io = require('socket.io')(http);
    
    module.exports = {
        app: app,
        http: http,
        io: io
    }
    

    文件2:type1.js

    const io = require('./path/to/server-init').io;
    // Alternatively you can use the syntax:
    // const { io } = require('./path/to/server-init');
    
    function init () {
      io.of('/type1').on
      (   'connection', socket => 
      {   socket.on
          (   'call1', () =>
              {   doSomething1();
              }
          );
      }
      );
    }
    
    module.exports = init;
    

    文件3:type2.js

    const io = require('./path/to/server-init').io;
    
    function init () {
      io.of('/type2').on
      (   'connection', socket => 
      {   socket.on
          (   'call2', () =>
              {   doSomething2();
              }
          );
      }
      );
    }
    
    module.exports = init;
    

    main.js

    const type1 = require('./path/to/type1.js');
    const type2 = require('./path/to/type2.js');
    const { http, app } = require('./path/to/server-init');
    
    // some init code
    
    type1.init();
    type2.init();
    http.listen(PORT);