NodeJS Express – 如何从控制器检索socketio房间列表

我的app.js文件中有一个socket.io服务器

 const port = process.env.PORT || 3000; const server = https.createServer(options, app); const io = require('socket.io'); const ios = io(server); const routes = require('./routes/index'); app.use('/', routes); 

从那个文件中,我知道如何获得房间清单

 ios.sockets.adapter.rooms 

现在我需要从我的一个路由文件(其中我也实现“控制器”逻辑,我会稍后重构)访问ios

 # routes/index.js var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { // // I'd like to check ios.sockets.adapter.rooms HERE // HOW DO I DO THAT? }); module.exports = router; 

这是一种方式,也许没有最好的办法。
您需要将io实例传递给路由器。 我使用包装函数。

 //router.js const router = express.Router(); const wrapper = function(io){ //work with your router router.get('/endpoint',(req,res) => { }); }); export default wrapper; ------------------------------------ //server.js import yourRouter from "./yourRouter"; //socket const server = http.createServer(app); const io = socket(server); //express app.use(logger('dev')); app.use(bodyParser.json()); //here you can pass the instance app.use(yourRouter(io)); 

另一种使用中间件的方式

 //server.js // middleware app.use((req, res, next) => { req.io = io; next(); }); app.use(yourRouter); //router.js import express from 'express'; const router = express.Router(); router.get('/payments/cancel', (req, res) => { //get the instance const io = req.io; res.send('Ok'); }); export default router; 

第二个是更清洁,不需要包装function。