2015-04-26 66 views
4

在我的Express 4路由中添加Socket.io需要很長的時間。在我的路線/ index.js我有:Express 4使用Socket.io的路由

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function (req, res, next) { 
    res.render('index', { title: 'Express' }); 
}); 

router.post('/message', function(req, res) { 
    console.log("Post request hit."); 
    // res.contentType('text/xml'); 
    console.log(appjs); 
    io.sockets.emit("display text", req); 
    // res.send('<Response><Sms>'+req.body+'</Sms></Response>'); 
}); 

module.exports = router; 

但io是未定義的。我已經看到了幾個如何做到這一點的例子,但沒有一個適用於我。任何幫助,將不勝感激。

+1

'var io = require(「socket.io」)(app)'? (其中應用程序是你的http服務器) –

+0

在我的app.js文件的根目錄 –

回答

6

您需要將您的socket.io變量傳遞給路由器模塊,以便它可以訪問。你可以通過在函數調用中包裝你的模塊來做到這一點。

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
var returnRouter = function(io) { 
    router.get('/', function(req, res, next) { 
     res.render('index', { 
      title: 'Express' 
     }); 
    }); 

    router.post('/message', function(req, res) { 
     console.log("Post request hit."); 
     // res.contentType('text/xml'); 
     console.log(appjs); 
     io.sockets.emit("display text", req); 
     // res.send('<Response><Sms>'+req.body+'</Sms></Response>'); 
    }); 

    return router; 
} 

module.exports = returnRouter; 

然後,whever你輸入這條路線,你會這樣調用函數:require(./routefile)(io)

下面是關於創建需要傳遞一個變量模塊的好文章:Node.Js, Require and Exports

+0

迄今爲止,我見過的將乾淨的套接字功能添加到路由器的最乾淨的解決方案!我必須到處搜尋才能找到這個! thx @LoganTegman –

+0

但同樣不適用於獲取請求,只適用於發佈請求 – zerocon

1

如何利用事件?這可以爲應用程序增加一層額外的自我意識,包括套接字消息。

由於快遞公司的App()從節點的eventEmitter繼承,我app.emit('EVENT_NAME', payload)在我的路線處理器, 任何一點,然後只處理與app.on('EVENT_NAME', function(payload){}) 可用任何邏輯。我在當前的設置中使用它。