NodeJS,SocketIO和Express逻辑上下文构build

我读了很多关于Express / SocketIO的信息,这很疯狂,除了直接从app.js发送的“Hello”之外,很less有其他例子。 问题是它在现实世界中不能这样工作……我实际上对一个似乎远离networking给我的逻辑问题感到绝望,这就是为什么我想指出这一点,我确定问会是解决scheme! 🙂

我正在重构我的应用程序(因为使用全局范围放置库等有很多错误); 假设我有一个基于SocketIO和NodeJS的巨大系统。 app.js中有一个启动套接字系统的加载器。

当有人join应用程序时,它需要()另一个模块:它初始化许多被dynamic加载的socket.on(),并转到文件夹中的一些/*_socket.js文件。 这些模块中的每个函数都表示一个套接字侦听器,然后从前端调用它更容易,可能看起来像这样:

// Will call `user_socket.js` and method `try_to_signin(some params)` Queries.emit_socket('user.try_to_signin', {some params}); 

系统本身工作得很好。 但是有一个问题:将加载所有那些理解前端发送的文件的模块也会传送与req / res(会话,cookies,其他…)链接的库,并且必须这样做,因为被调用的方法是应用程序的核心,并经常需要这些库。

在前面的例子中,我们显然需要检查用户是否已经login。

  // The *_socket.js file looks like this : var $h = require(__ROOT__ + '/api/helpers'); module.exports = function($s, $w) { var user_process = require(__ROOT__ + '/api/processes/user_process')($s, $w); return { my_method_called: function(reference, params, callback) { // Stuff using $s, $w, etc. } } // And it's called this way : // $s = services (a big object) // $w = workers (a big object depending on $s) // They are linked with the req/res from the page when they are instantiated controller_instance = require('../sockets/'+ controller_name +'_socket')($s, $w); // After some processes ... socket_io.on(socket_listener, function (datas, callback) { // Will call the correct function, etc. $w.queries.handle_socket($w, controller_name, method_name, datas); }); 

好消息:基本上是有效的。

坏消息是,每次刷新页面时, 监听器都会自我加倍,因为它们是在页面加载时调用的。

下面,这应该是一行:

在这里输入图像说明

所以我应该把所有的socket.on('连接'…)的东西放在页面加载之外,这意味着当服务器启动时…是的,但我也需要req / res数据能够加载库,我只有当页面加载时才得到!

这是一个编程逻辑问题,我知道我做错了,但我不知道现在要去哪里,我有这个“基本上”工作的大系统,但是我做了这样一个悖论,我无法确定出了怎样解决这个问题……我被困了几个小时。

我怎样才能让一个socket.on()调用中取决于req / res的当前库的可能性? 有一个窍门吗? 我应该考虑彻底改变自己的方式吗?

另外,还有另一种方法可以做我想做的事情吗?

谢谢大家 !

注意:如果我没有解释清楚,或者如果你想要更多的代码,只要告诉我:)

编辑 – 解决scheme:如上所示,我们可以使用sockets.once(); 而不是sockets.on(),或者也有sockets.removeAllListeners()解决scheme,这是不太干净。

尝试如下。

 io.sockets.once('connection', function(socket) { io.sockets.emit('new-data', { channel: 'stdout', value: data }); }); 

使用一次,而不是。

此问题与以下链接中给出的相似。

https://stackoverflow.com/questions/25601064/multiple-socket-io-connections-on-page-refresh/25601075#25601075