2016-04-17 62 views
1

我有點困惑;NodeJS,socketIO,多個文件

我想在NodeJS應用程序上使用socketIO。 我創造了這個(僞)代碼:

//server.js 
var app = express(); 
//some code... 
var router = require('./app/router'); 
app.use(router); 

var server = app.listen(appConfig.app.port, function() { 
    var port = server.address().port; 
}); 
var io = require('socket.io')(server); 
io.on('connection', function (client) { 
    console.log('Client connected...'); 

    client.on('join', function (data) { 
     console.log(data); 
    }); 
}); 


//client.js 
var socket = io.connect('http://localhost:5555'); 
socket.on('connect', function(data) { 
    socket.emit('join', 'Hello World from client'); 
}); 

一切都很好。但是!

現在,我想在另一個文件中發出事件。 我有路由器和POST請求。我想在POST請求上發出事件(請求處理程序在另一個文件中)。

//router.js 
router.route("/addmenu").post(function (req, res) { 
     menuModel.addMenu(req.body,function(data){ 
      //I WANT EMIT HERE 
      res.json(data) 
     }); 
    }; 
); 

我必須初始化啓動服務器之前的路由器,但我必須要通過服務器IO ...如何通過IO到路由器?

+0

你想從您的路徑回調發出事件發送到所有連接的客戶端? – jahnestacado

回答

2

你可以試試這個

//server.js 
var app = express(); 
//some code... 
var io; 
var getIOInstance = function(){ 
    return io; 
}; 
var router = require('./app/router')(getIOInstance); 
app.use(router); 

var server = app.listen(appConfig.app.port, function() { 
    var port = server.address().port; 
}); 

io = require('socket.io')(server); 
io.on('connection', function (client) { 
    console.log('Client connected...'); 

    client.on('join', function (data) { 
     console.log(data); 
    }); 
}); 

//router.js 
module.exports = function(getIOInstance){ 
    router.route("/addmenu").post(function (req, res) { 
     menuModel.addMenu(req.body,function(data){ 
      //I WANT EMIT HERE 
      getIOInstance().sockets.emit(...) 
      res.json(data) 
     }); 
    }; 
    return router; 
); 

,如果你想 '通知' 的所有連接的客戶端這個解決方案會奏效。

如果你需要通知只是一個特定的客戶端,那麼我會建議你爲了在多個文件進行溝通這些事件並沒有分享您的插座實例使用事件發射器模塊。

+0

連接是好的,但在router.js io是未定義的... – IceManSpy

+0

謝謝,它的工作原理!我認爲這會更容易。可能我必須重構我的項目以更容易地使用socketIO。 – IceManSpy

0

在router.js,你可以這樣做:

//router.js 
module.exports = function(io) { 
var router = //What you declared it to be 
router.route("/addmenu").post(function (req, res) { 
    menuModel.addMenu(req.body,function(data){ 
     //I WANT EMIT HERE 
     res.json(data) 
    }); 
}; 
); 
return router; 
} 


//server.js 
//Change this line to be like the one below 
var router = require('./app/router'); 
//......... 
//....... 

//Desired way 
var router = require('./app/router')(io);