小编典典

从Express控制器发出Socket.io

angularjs

我对Node.js /
Express很陌生,并且将它用作AngularJS应用程序的后端。我到处都在StackOverflow上寻求有关此问题的帮助,但似乎无法弄清楚如何将建议移植到我的代码中。

我的应用程序如下工作:

  • 长时间运行的Scala进程会定期发送我的Node.js应用程序日志消息。它通过发布到HTTP API来做到这一点
  • 收到帖子后,我的应用程序将日志消息写入MongoDB
  • 然后将日志消息实时发送到Angular客户端。

我无法使用Node的模块,因为我不知道如何在Express控制器中引用套接字实例。

如您所见,在server.js中,socket.io在此处实例化。但是,我希望控制器本身可以使用socket.io实例发出logs.js。

如何在控制器中引用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)
};

阅读 276

收藏
2020-07-04

共1个答案

小编典典

您可以使用基于标准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处理这些事情,或者使用模拟“套接字”测试您的控制器,则此模式很好用。

2020-07-04