Javascript NodeJS、SocketIO和Express逻辑上下文构建

Javascript NodeJS、SocketIO和Express逻辑上下文构建,javascript,node.js,sockets,express,socket.io,Javascript,Node.js,Sockets,Express,Socket.io,我读了很多关于Express/SocketIO的书,这真是太疯狂了,除了直接从app.js发送的“Hello”之外,很少有其他的例子。问题是它在现实世界中不是那样工作的。。。事实上,我对一个逻辑问题感到绝望,这个问题似乎与网络给我的答案相去甚远,这就是为什么我想指出这一点,我相信提问将是解决办法!:) 我正在重构我的应用程序(因为有很多错误,比如使用全局作用域放置libs等等);假设我有一个基于SocketIO和NodeJS的大型系统。app.js中有一个加载程序,用于启动套接字系统 当有人加入

我读了很多关于Express/SocketIO的书,这真是太疯狂了,除了直接从app.js发送的“Hello”之外,很少有其他的例子。问题是它在现实世界中不是那样工作的。。。事实上,我对一个逻辑问题感到绝望,这个问题似乎与网络给我的答案相去甚远,这就是为什么我想指出这一点,我相信提问将是解决办法!:)

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

当有人加入应用程序时,它需要()另一个模块:它初始化许多动态加载的socket.on(),并转到文件夹中的一些/*\u 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);

  });
好消息是:基本上,它是有效的

坏消息是:每次我刷新页面时,监听器都会加倍,因为它们处于一个名为“页面加载”的循环中

下面,这应该是一行:

所以我应该将所有socket.on('connection')内容放在页面加载之外,这意味着当服务器启动时。。。是的,但是我还需要req/res数据才能加载库,只有在加载页面时才能得到这些库

这是一个编程逻辑问题,我知道我做错了什么,但我不知道现在该怎么办,我有一个“基本”工作的大系统,但在我做的过程中有一个悖论,我不知道如何解决这个问题。。。已经好几个小时了,我被卡住了

如何进行重构,使其能够根据socket.on()调用中的req/res获取当前库?有什么诀窍吗?我应该考虑彻底改变我的做事方式吗

还有,还有别的方法可以做我想做的事吗

谢谢大家

注意:如果我解释得不好,或者您需要更多代码,请告诉我:)

编辑-解决方案:如上所示,我们可以使用sockets.once();而不是sockets.on(),或者还有sockets.removeAllListeners()解决方案,该解决方案不太干净。

请尝试以下方法

io.sockets.once('connection', function(socket) {
  io.sockets.emit('new-data', {
    channel: 'stdout',
    value: data
 }); 
});
使用一次,而不是打开

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


您的解决方案非常有效!我还提供了一个套接字解决方案;这重置了听众,但你的方式肯定更好!这很好,现在我们有两种解决方案:)