0

所以,我正在制作一个应用程序,并且我已经让套接字 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 变量似乎不能在多个文件之间共享......有没有一种好的、干净的方法来做到这一点?

4

1 回答 1

2

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

这不是真的。您可以io像任何其他变量一样将变量传递给函数和模块。也像任何其他变量一样,它会自动私有地限定为单个文件。

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

方法一:传入io函数。

拆分逻辑的一种方法是将其拆分为多个模块。由于您可以将对象传递给函数,因此您的模块应该导出函数。例如:

  • 文件 1: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它只是一个常规变量。就像任何变量一样,您可以将其作为函数参数传递。这里没有什么花哨的,这是编程语言的所有基本特征。

io方法2:作为一个模块共享。

另一种技术特定于模块在 node.js 中的工作方式。模块是节点中的单例。这意味着一个模块恰好代表一个对象。如果模块中有 3 个不同的文件require(),它们都将获得相同的对象。

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

  • 文件 1:服务器-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);
    
于 2020-12-06T14:59:29.710 回答