我对Node.js / Express很陌生,并且将它用作AngularJS应用程序的后端。我到处都在StackOverflow上寻求有关此问题的帮助,但似乎无法弄清楚如何将建议移植到我的代码中。
我的应用程序如下工作:
我无法使用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) };
您可以使用基于标准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应该接收套接字以用作参数。
routes
如果您想稍后使用DI处理这些事情,或者使用模拟“套接字”测试您的控制器,则此模式很好用。