2014-09-03 18 views
1

我读了很多关于快递/ SocketIO那简直是疯了,你怎么很少得到比“你好”直接从app.js.传输其他一些例子问题是它在现实世界中并不像那样工作......我实际上对一个似乎远离网络给我的逻辑问题感到绝望,这就是为什么我想指出这一点,我确信问问题将是解决方案! :)的NodeJS,SocketIO和Express Logic公司方面建立

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

当有人加入它需要()另一个模块的应用:它初始化许多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(会话,cookie,其他...)链接的库,并且必须这样做,因为被调用的方法是应用程序的核心并且经常需要这些库。

在前面的例子中,我们显然需要检查,如果用户还没有登录项。

// 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); 

    }); 

好消息:基本上,它的工作原理。

坏消息:每次刷新页面,听众自己加倍,因为他们在页面加载调用的循环中。

以下,这应该是一条线:

enter image description here

所以我应该把所有的socket.on(“连接” ......)的页面加载之外的东西,这意味着当服务器开始......是的,但我也需要req/res数据库才能加载库,我只有在加载页面时才能获得这些库!

这是一个编程逻辑问题,我知道我做错了什么,但我现在不知道该走到哪里,我得到了这个“基本上”工作的大系统,但是我做这件事的方式有一个悖论。无法弄清楚如何解决这个问题......我被卡住了几个小时。

我该如何反思,以便在socket.on()调用中根据req/res获取当前库的可能性?有没有一招?我应该考虑彻底改变自己的方式吗?

此外,有另一种方式做我想做的事?

谢谢大家!

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

编辑 - 解决方案:就像上面我们可以使用sockets.once();而不是sockets.on(),或者还有sockets.removeAllListeners()解决方案,它不那么干净。

回答

3

请尝试以下。

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

使用一次而不是on。

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

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

+0

您的解决方案就像一个魅力!我也有一个sockets.removeAllListeners()的解决方案;这会重置听众,但您的方式肯定会更好! – Laurent 2014-09-03 19:25:58

+0

这很好,现在我们有这个问题的两个解决方案:) – 2014-09-04 07:35:50