Socket.io从Express控制器发出

我对Node.js / Express很新,我将它用作AngularJS应用程序的后端。 我查看了所有的StackOverflow在我的问题一些帮助,但我似乎无法弄清楚如何将build议移植到我的代码。

我的申请工作如下:

  • 长期运行的Scala进程会定期发送我的Node.js应用程序日志消息。 它通过张贴到HTTP API来完成
  • 收到post后,我的应用程序将日志消息写入MongoDB
  • 日志消息然后实时发送到Angular客户端。

我有一个Node的模块的问题,因为我不知道如何引用Express控制器中的套接字实例。

正如你所看到的,在server.js中,socket.io在那里被实例化。 但是,我希望控制器本身logs.js能够使用socket.io实例发出。

我如何在控制器中引用io? 我不知道如何将io实例传递给控制器​​,以便发送消息?

这里是一些节点代码:

server.js

var app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server); require('./lib/config/express')(app); require('./lib/routes')(app); server.listen(config.port, config.ip, function() { console.log('Express server listening on %s:%d, in %s mode', config.ip, config.port, app.get('env')); }); io.set('log level', 1); // reduce logging io.sockets.on('connection', function(socket) { console.log('socket connected'); socket.emit('message', { message: 'You are connected to the backend through the socket!' }); }); exports = module.exports = app; 

routes.js

 var logs = require('./controllers/logs'), middleware = require('./middleware'); module.exports = function(app) { app.route('/logs') .post(logs.create); } 

logs.js

 exports.create = function(req, res) { // write body of api request to mongodb (this is fine) // emit log message to angular with socket.io (how do i refer to the io instance in server.js) }; 

您可以使用基于标准JSclosures的模式。 logs.js的主要导出不是控制器函数本身,而是一个工厂函数,它将接受所有需要的依赖关系,并创build控制器:

 exports.create = function(socket) { return function(req, res) { // write body of api request to mongodb socket.emit(); } } 

那么,当你想使用它:

 app.route('/logs').post(logs.create(socket)); 

由于您在一个单独的包中设置路由,因此您必须在routes.js使用相同的模式 – routes应该接收用作参数的套接字。

如果你想用DI来处理这些事情,或者用模拟“套接字”来testing你的控制器,这种模式很好。