gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:37:29 24 4
gpt4 key购买 nike

我读了很多关于 Express/SocketIO 的文章,除了直接从 app.js 传输的“Hello”之外,你很少得到其他例子,这真是太疯狂了。问题是它在现实世界中并不像那样工作......我实际上对一个逻辑问题感到绝望,它似乎与网络给我的东西相去甚远,这就是为什么我想指出这一点,我敢肯定问将是解决方案! :)

我正在重构我的应用程序(因为有很多错误,比如使用全局范围来放置库等);假设我有一个基于 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 链接的库( session ,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('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
});
});

使用一次而不是一次。

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

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

关于javascript - NodeJS、SocketIO 和 Express 逻辑上下文构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com