【问题标题】:Asynchronous socket.io module sharing among different files and scripts不同文件和脚本之间的异步 socket.io 模块共享
【发布时间】:2017-01-07 04:12:22
【问题描述】:

我的项目如下所示

io.js

var io = require('socket.io')();

var socketioJwt = require('socketio-jwt');
var jwtSecret = require('./settings').jwtSecret;

io.set('authorization', socketioJwt.authorize({
  secret: jwtSecret,
  handshake: true
}));

io.on('connection', function(socket) {

});

module.exports = io;

应用、js

var io = require('./io');

...

var server = http.createServer(app);

io.attach(server);

server.listen(33666);

现在我想在另一个脚本中使用套接字,以便像这样向连接的用户发送消息:

script.js

var io = require('./io');
...
io.emit(event, msg);

我的问题是,当我在 script.js 中记录 io.sockets.connected 时,它总是作为空对象返回。我已经缩小了我的问题范围,我相信这是因为当需要 script.js 中的 io 模块时,io.js 正在运行再次,因此我正在实例化一个新的 io 对象。 知道如何克服这个问题吗?

谢谢。

【问题讨论】:

  • 这看起来与您之前的问题几乎相同:stackoverflow.com/questions/39196031/…。正如我在那里所说,当您实际上有一些成功的 socket.io 连接连接到您的服务器时,io.sockets.sockets 将是一个连接的套接字数组。如果你说数组是空的,那么你必须向我们证明/告诉我们为什么你认为实际上有连接的套接字,但是数组是空的。我不相信有连接的套接字并且数组是空的。
  • 如果您在scripts.js 中使用console.log(io.sockets.connected),那么它可能是在实际上有任何连接的套接字之前。您没有向我们展示实际代码,因此我们无法帮助您解决问题的重要部分。这现在看起来像是您之前的问题的重复,您只是在合并了其他答案中的一些内容后才决定再次发布,但仍然没有解决您检查 io.sockets.connected 时的相关问题。
  • 其余的解释在于您没有向我们展示的代码。 “在节点服务器启动后正在运行 script.js”是什么意思?如何/何时运行?你确定只有一个 io.js 文件吗?向我们展示加载 scripts.js 的实际代码,并向我们展示 scripts.js 中您没有得到正确答案的实际代码。你只是没有向我们展示足够的东西,我们无法进一步帮助你。

标签: javascript node.js asynchronous socket.io server


【解决方案1】:

您的app.js 文件是初始化您的套接字服务器的文件,因此您必须在script.js 文件中要求它:

var io = require('./io');
require('./app');
...
io.emit(event, msg);

顺便说一句,节点缓存所有需要,因此您怀疑节点“再次运行”您的 io.js 文件实际上是不正确的 - 第二次调用 require('./io') 所做的唯一事情就是返回您的 io 实例引用。

【讨论】:

  • 你好@mdziekon,实际上我确实选择了你提供的解决方案。但后来我遇到了另一个问题。 script.js 是一个工作脚本,将在我的应用程序中多次生成。因此我得到了 Error: listen EADDRINUSE 在产生了许多工人之后,因为他们都需要 app.js 。还有其他解决方法吗?
  • @georgehelou 我假设您正在谈论生成多个处理。在这种情况下,您应该知道一个侦听端口一次只能由一个操作系统进程使用。要解决node 中的这个问题,您应该查看Cluster API,它可以让您在多个应用程序“实例”之间共享单个端口。
  • 是的,也许我对再次运行的模块有误,但我很确定我得到了另一个对正在导出的 io 对象的引用。这是我没有连接套接字这一事实的唯一解释。你知道如何在 script.js 中不需要 app.js 来克服这个问题吗?
  • 是的@mdziekon 我知道。但我的问题不存在。我要做的就是在多个文件之间共享 io 对象,而无需再次运行模块并获取另一个 io 对象。
  • 能否请您发布您检查io.sockets.connected 属性的确切代码?
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多