过去几天我一直在四处寻找,以便从我的路线访问在Express中运行的套接字IO实例,并且找不到可行的解决方案。
这里的问题是我只在运行时运行我的套接字IO实例和我的路由并在此之前定义。
我找到的最有希望的解决方案是将我的路由包装在一个函数中并在我的app.js文件中需要它,同时将IO实例作为参数传递,如var routes = require('routes')(io)
这是我的设置:
app.js
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.on('connection', function(client) {
console.log(io.sockets.sockets)
});
app.set('port', 7777);
const routes = require('./routes/index')(io);
app.use('/', routes);
app.listen('7777');
routes.js
module.exports = function(io) {
const express = require('express');
const router = express.Router();
router.get('/test', (req, res) => {
console.log(io.sockets.sockets);
});
return router;
}
如果我连接到WebSocket,我的io.on
事件将触发,并以包含套接字ID等的相当大的对象的形式获得连接套接字的控制台日志。
但是,如果我到达路由'/test'
,我会得到一个空白对象的控制台日志:{}
。我想这是因为我传递给路由的套接字实例当时没有任何人连接到它,因此返回空白对象,但这只是我最好的猜测。
我有点陷入困境的是如何获得与路线的所有实时连接的完整实例。
或者,我想过将io实例附加到请求对象,以便在路由中访问它:
server.on('request', function(req, res){
req.io = io;
}
但是不能完全开始工作,我也不确定这是正确的做法。
我认为这一定是一个常见的问题所以我希望能够就如何解决这个问题以及解决问题的正确方法找到明确的答案。
修改
所以我最终得到了上面的代码,我从chrome扩展中的AJAX GET请求中点击了'/test'
端点,而不是我刚刚访问的URL localhost:7777 / test。我在这里无法理解的是为什么它适用于AJAX请求而不是页面导航? (在扩展程序中建立套接字连接后,页面导航完成)