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;

第二个更干净,不需要包装器函数。

最新更新