2016-04-17 102 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);