2017-01-26 21 views
1

檢索socketio房名單上有一個socket.io服務器在我app.js文件快遞的NodeJS - 如何從控制器

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; 

回答

1

這是一種方式,也許沒有最好的辦法。
您需要將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; 

;二是更清潔,而且不需要包裝函數的另一種方式。

+1

非常感謝。我去了中間件選項。我現在也瞭解如何使用中間件!隊友的歡呼聲。 – zabumba