异步socket.io不同的文件和脚本之间共享模块
我已经奠定了我的项目如下所示异步socket.io不同的文件和脚本之间共享模块
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);
我的问题是,当我登录io.sockets.connected
内的script.js它总是返回一个空的对象。我缩小了我的问题,我相信这一切,因为需要内部的script.js,io.js的IO模块时再次运行,因此,我实例化一个新IO对象。 任何想法如何克服这个问题?
谢谢。
你app.js
文件是初始化您的套接字服务器的人,因此,你有权要求它在script.js
文件:
var io = require('./io');
require('./app');
...
io.emit(event, msg);
BTW,节点缓存所有要求,所以你怀疑有关节点“再次运行”您的io.js
文件实际上不是真的 - 第二次调用require('./io')
所做的唯一事情是返回io
实例引用。
hello @mdziekon,其实我选择了你提供的解决方案。但后来我遇到了另一个问题。 script.js是一个工作脚本,将在我的应用程序中衍生很多次。因此,我得到错误:侦听EADDRINUSE后产卵许多工人,因为他们都需要app.js。任何其他的工作? – georgehelou
@georgehelou我假设你正在谈论多处理正在产卵。在这种情况下,您应该知道一次只能由一个OS进程使用单个侦听端口。为了克服''node''中的这个问题,你应该查看[Cluster API](https://nodejs.org/docs/latest/api/cluster.html),它让你可以在多个应用程序“实例”之间共享单个端口。 – mdziekon
是的也许我错了关于再次运行的模块,但我非常确定,我正在获取另一个被导出的io对象的引用。这是我没有连接套接字的事实的唯一解释。你有没有想法如何克服,而不需要script.js中的app.js? – georgehelou
这看起来和你以前的问题非常相似:http://stackoverflow.com/questions/39196031/unable-to-persist-a-sockets-array-upon-user-connection。正如我在那里说的,当你实际上有一些成功的socket.io连接连接到你的服务器时,'io.sockets.sockets'将是一组连接的套接字。如果你说数组是空的,那么你必须向我们证明/告诉我们为什么你认为有实际连接的套接字,但是数组是空的。我不相信有连接的套接字,而且数组是空的。 – jfriend00
如果你在'scripts.js'内执行'console.log(io.sockets.connected)',那么它可能在实际上有任何连接的套接字之前。您不会向我们显示实际的代码,因此我们无法帮助您解决问题的重要部分。这现在看起来像你以前的问题的一个重复,你刚刚决定从其他答案中合并几件事后再次发布,但仍然没有解决检查'io.sockets.connected'时的问题。 – jfriend00
解释的其余部分在于你没有向我们展示过的代码。这意味着“script.js在节点服务器启动后正在运行”?如何/何时运行?你确定只有一个io.js文件吗?向我们展示加载scripts.js的ACTUAL代码,并在scripts.js中向我们展示ACTUAL代码,但您没有得到正确的答案。你只是没有显示我们足够的帮助我们进一步帮助你。 – jfriend00