2014-05-19 2 views
6

Я довольно новичок в Node.js/Express, и я использую его как бэкэнд для приложения AngularJS. Я просмотрел StackOverflow для некоторой помощи по моей проблеме, но я не могу понять, как переносить предложения в мой код.Socket.io emit from Express контроллеры

Мое приложение работает следующим образом:

  • Долгий работает процесс Scala периодически отправляет свои сообщения в журнале приложения Node.js. Он делает это, отправляя HTTP API
  • Когда сообщение получено, мое приложение записывает сообщение журнала в MongoDB
  • Сообщения журнала затем отправляются в режиме реального времени для Углового клиента.

У меня проблема с модулями узла, так как я не могу понять, как обращаться к экземпляру сокета в контроллере 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) 
}; 

ответ

7

Вы можете использовать шаблон, основанный на стандартных затворах 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 позже или проверить свои контроллеры с помощью «сокетов».

+0

Спасибо, ты мой герой! – mousetree

+0

Как вы определяете socket в routes.js, чтобы использовать его в маршруте, как показано выше? –

+0

@CoreyQuillen: вот пример моих маршрутов. Js - https://gist.github.com/mousetree/7585c9d108cfc006a582 – mousetree

Смежные вопросы