2014-05-19 35 views
6

Node.js/Express'te oldukça yeniyim ve bunu bir AngularJS uygulaması için arka uç olarak kullanıyorum. Sorunumda yardım için StackOverflow'un her yerine baktım, ancak önerileri koduma nasıl yönlendireceğimi anlayamıyorum. aşağıdaki gibiSocket.io, Express denetleyicilerinden yayar

başvurum çalışır:

  • Uzun çalışan Scala işlemi periyodik benim node.js uygulama günlük iletilerini. Bu mesaj alındığında, başvurum
  • kayıt mesajları daha sonra Açısal müşteriye gerçek zamanlı olarak gönderilir MongoDB
  • için günlük mesaj yazar bir HTTP API
  • gönderme yapar.

Express denetleyicisinde soket örneğine nasıl başvuracağımı anlayamadığım için, Node modüllerinde bir sorun yaşıyorum.

Gördüğünüz gibi, server.js'de socket.io orada başlatılmıştır. Bununla birlikte, socket.io örneğini kullanarak yayınlayabilmek için denetleyicinin kendisinin, logs.js olmasını isterim.

nasıl denetleyicisi io başvurabilirsiniz? Io örneğini denetleyiciye nasıl ileteceğimi bilemiyorum, böylece ileti gönderebiliyorum? İşte

Düğüm kodunun bir kısmı:

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

cevap

7

Standart JS kapanışları dayalı bir desen kullanabilirsiniz. logs.js ana ihracat denetleyici işlevi kendisi, ancak tüm gerekli bağımlılıkları kabul edecek bir fabrika fonksiyonu olabilir ve denetleyici oluşturmaz:

app.route('/logs').post(logs.create(socket)); 
: Bunu kullanmak istediğinizde, sonra

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

parametre olarak kullanmak soket almalıdır routes - ayrı bir pakette yollarını ayarlamak yana

, sen routes.js aynı desen kullanmak zorunda.

daha sonra DI ile bunları işlemek veya sahte "prizlere" ile Denetleyicilerinizi test etmek istiyorsanız bu model iyi çalışıyor.

+0

Teşekkürler, sen benim kahramanımsın! – mousetree

+0

Yukarıda gösterildiği gibi rotada kullanmak için route.js içinde soketi nasıl tanımlarsınız? –

+0

@CoreyQuillen: İşte bir rotaları.js örneği - https://gist.github.com/mousetree/7585c9d108cfc006a582 – mousetree