Javascript NodeJS、SocketIO和Express逻辑上下文构建
我读了很多关于Express/SocketIO的书,这真是太疯狂了,除了直接从app.js发送的“Hello”之外,很少有其他的例子。问题是它在现实世界中不是那样工作的。。。事实上,我对一个逻辑问题感到绝望,这个问题似乎与网络给我的答案相去甚远,这就是为什么我想指出这一点,我相信提问将是解决办法!:) 我正在重构我的应用程序(因为有很多错误,比如使用全局作用域放置libs等等);假设我有一个基于SocketIO和NodeJS的大型系统。app.js中有一个加载程序,用于启动套接字系统 当有人加入应用程序时,它需要()另一个模块:它初始化许多动态加载的socket.on(),并转到文件夹中的一些/*\u socket.js文件。这些模块中的每个函数都代表一个套接字侦听器,因此从前端调用它更容易,可能如下所示: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中有一个加载程序,用于启动套接字系统 当有人加入
// 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
});
});
使用一次,而不是打开
此问题与以下链接中给出的问题类似
您的解决方案非常有效!我还提供了一个套接字解决方案;这重置了听众,但你的方式肯定更好!这很好,现在我们有两种解决方案:)