2016-06-16 1 views
3

Ich benutze socket.io zwischen meiner eckigen App und meinem Server ohne Probleme, aber ich weiß nicht, wie es geht, wenn es darum geht, socket.io in meinen Routen zu verwenden.Verwendung von socket.io in Routen

Hier ist, was ich bisher getan:

app.js

var server = app.listen(port); 
var io = require('socket.io').listen(server); 
io.sockets.on('connection', function (socket) { 
socket.on('server',function(data){ 
    log.info(data.message); 
}); 
socket.on('console',function(data){ 
    log.info(data.message); 
}); 
socket.emit('client',{action:"test"}); 
}); 

wie ich schon sagte, es funktioniert.

Jetzt möchte ich socket.io in einem meiner Routen verwenden, Routen aus meinem Router geladen:

require('./app/my.routes')(app,io);//i've tried to use it this way 

my.routes.js

module.exports = function (app,io){ 
    io = app.get('io');//and get it this way 
    io.sockets.emit('socket.io :: sucessfully passed from app to router') 
    log.info('Trying to load express routes...'); 
    router.use(function (req, res, next) { 
     next(); // make sure we go to the next routes and don't stop here 
    }); 
    require('./models.mongoose/user'); 
    //require routes 
    var consoleRoute = require('./express.routes/console.route') 
    ... 

und jetzt habe ich diesen Fehler haben

io.sockets.emit('socket.io :: sucessfully passed from app to router') 
^

TypeError: Cannot read property 'sockets' of undefined 

Ich muss natürlich etwas falsch machen, aber ich habe keine Ahnung was. Irgendwelche Ideen?

Ich habe auch versucht app.set ('io', io) in app.js und app.get ('io') auf der anderen Seite aber sie nicht alle die gleiche

SOLUTION

Schließlich habe ich die Lösung gefunden,

app.io = io.sockets.on('connection', function (socket) { 
socket.on('server', function (data) { 
    log.info(data); 
}); 
socket.emit('client', { 
    action: "alert", 
    text: 'test from socket io' 
    }); 
});; 

Jetzt ist es zu App verknüpft, und ich kann es überall benutzen.

Antwort

5

Sie können Ihre Socket-io-Implementierung in Ihrer Express-Konfigurationsdatei einrichten und Ihr "io" -Objekt als Variable innerhalb der App übergeben.

app.io = io; 

die Idee ist, so etwas zu tun:

module.exports = function (app){ 
    app.io.sockets.emit('socket.io sucessfully passed from app to router'); 
} 
+0

meinst du: app.io = io in meinem app.js und dann var x = erfordern (somefile) (app, io) also kann ich es in einer Datei wie io.emit (....) verwenden? – antares667367

+1

Pass einfach die App, da es immer das io-Objekt referenziert wie require ("routes") (app) –

+0

ok jetzt, es gibt keinen Fehler mehr, aber es ist völlig still, wie nichts passiert.weird.Ich werde weiter untersuchen. – antares667367