簡體   English   中英

Socket.io從Express控制器發出

[英]Socket.io emit from Express controllers

我是Node.js / Express的新手,我將它用作AngularJS應用程序的后端。 我已經遍布StackOverflow尋求一些關於我的問題的幫助,但我似乎無法弄清楚如何將建議移植到我的代碼中。

我的申請表如下:

  • 長時間運行的Scala進程會定期發送我的Node.js應用程序日志消息。 它通過發布到HTTP API來實現
  • 收到帖子后,我的應用程序將日志消息寫入MongoDB
  • 然后將日志消息實時發送到Angular客戶端。

我遇到Node的模塊問題,因為我無法弄清楚如何引用Express控制器中的套接字實例。

如您所見,在server.js中,socket.io在那里實例化。 但是,我希望控制器本身logs.js能夠使用socket.io實例發出。

如何在控制器中引用io? 我不知道如何將io實例傳遞給控制器​​,以便我可以發出消息?

以下是一些Node代碼:

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

您可以使用基於標准JS閉包的模式。 logs.js的主要導出不是控制器函數本身,而是一個工廠函數,它將接受所有需要的依賴項,並創建控制器:

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處理這些內容,或者使用模擬“套接字”測試控制器,則此模式很有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM