2017-12-12 7 views
0

emittieren So verwende ich ein Singleton-Muster, um meine Websocket einzurichten.Wie von Client-Seite zu einer Route-Datei mit Socket.io in Node.js

var sio = require('socket.io') 
var io = null; 

exports.io = function() { 
    var socket; 
    if(io === null){ // Initialise if not already made 
    io = initialize(server); 
    } 
    return io; 
}; 

exports.initialize = function(server) { 

    io = sio.listen(server); 
    var connections = []; 

    console.log('IO Initialized!\n') 

    io.on('connection', function(socket){ 
    connections.push(socket); 
    console.log('Connected: %s sockets connected', connections.length); 

    socket.on('disconnect', function(data){ 
     connections.splice(connections.indexOf(socket), 1); 
     console.log('Disconnected: %s sockets connected', connections.length); 
    }); 

    // Update function used to send messages to and from backend 
    socket.on('update', function(data){ 
     io.sockets.emit('new message', {msg: data}); 
    }); 


    }); 

}; 

Und dann in meinen öffentlichen/Javascript-Dateien kann ich diese wie so

$(function(){ 

    var socket = io.connect(); 
    socket.emit('update', 'Test Update'); 
    socket.on('update', function(data){ 
     console.log('here: ' + data); 
    }); 
}); 

und in meiner Route-Datei aufrufen Ich habe

router.use(function(req, res, next){ 
    if(socket === undefined){ 
     socket = io.io(); 
    } 
    next(); 
}); 

router.get('/', function(req, res, next){ 


    socket.on('update', function(data){ 
     console.log('in routes'); 
    }); 

    socket.emit('update', 'leaving routes'); 
}); 

ich erfolgreich aus der Routen-Datei emittieren an die öffentliche js-Datei (von Back-End zu Front-End). Ich kann jedoch keine Informationen aus der öffentlichen js-Datei an die routes-Datei senden, sondern sendet sie nur an die Singleton-Muster-js-Datei. Wie kann ich es stattdessen an die routes-Datei senden? Wenn ich in die falsche Richtung gehe, könnte jemand bitte einen Examplel darüber geben, wie man zwischen einer Route und einer öffentlichen js-Datei kommuniziert?

+0

Sie sehen falsch zu sein, was "Socket" ist. Es ist ein einzigartiges Objekt für jede eingehende Clientverbindung. Es ist kein Singleton. Du kannst es nicht einfach als global bezeichnen. In der Tat ist der einzige Ort, an dem Sie ihn wirklich benutzen können, der 'io.on ('connection', ....)' - Handler, da Sie dort jedes neue 'socket'-Objekt, das Verbindungen anbietet. Wenn Sie in Ihren Routen versuchen, auf das Socket-Objekt zuzugreifen, das einem bestimmten Benutzer entspricht, der in diesem Moment eine Anfrage stellt, dann ist das eine ganz andere Frage und es gibt viele andere Antworten hier, die das untersuchen. – jfriend00

+0

Ich würde vorschlagen, dass Sie hier nach "access socket.io Verbindung in Express-Route" suchen und sehen, was Sie finden. Der übliche Weg, um die beiden zu verbinden, ist über ein Session-Objekt und Sie initialisieren in der Sitzung, wenn die Verbindung socket.io verbindet, so dass Sie später in einer Route in die Session schauen können, um Zugriff auf die socket.id zu erhalten Sie können das Socket-Objekt erhalten. – jfriend00

Antwort

0

Soweit ich das beurteilen kann, gibt es nichts falsch mit Ihrem Singleton-Setup.

Jedoch, jeder Ort, an dem Sie für Veranstaltungen zu hören sind, müssen Sie es in io.on('connection', ...) wickeln. Es zu einem Singleton zu machen, verhindert nicht, dass dies eine Anforderung ist.

Edit: Ich kann hier falsch sein, habe ich bemerkt, dass nur exports.initialize eigentlich nicht connections zurück. Versuchte das?

Verwandte Themen