NodeJS,socketIO,多个文件

我有点困惑;

我想在NodeJS应用程序上使用socketIO。 我创build了这个(伪)代码:

//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路由器?

你可以试试这个

 //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; ); 

如果您想“通知”所有连接的客户端,此解决scheme将工作。

如果您只需要通知特定的客户端,那么我会build议您使用事件发射器模块来传达这些事件,而不是跨多个文件共享您的套接字实例。

在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); 
Interesting Posts