Dies ist eine Frage, die andere Leute gestellt haben, aber ich kann nicht von den Antworten profitieren, die sie bekommen haben, aufgrund der verschiedenen Express-Einstellungen, die ich habe.Wie kann ich Ereignisse aus Connected Sockets mit socket.io von meinen Express 4 Routen aus ausgeben?
Ich habe socket.io implementiert und funktioniert auf einfache Weise auf meinem Server. Dies ist, wie es funktioniert:
In bin/www
:
#!/usr/bin/env node
var debug = require('debug')('gokibitz');
var app = require('../../server');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
var io = require('socket.io').listen(server);
io.on('connection', require('../routes/socket.js'));
Alle meine Routen und andere Express-Setup in ../../server.js
ist.
var routes = require('./server/routes/index');
var user = require('./server/routes/user');
...
app.use('/', routes);
app.use('/api/user/', user);
...
app.use('*', routes);
Dann in ../routes/socket.js
, habe ich diese vorformulierten bekam:
module.exports = function (socket) {
socket.emit('send:news', { hello: 'world' });
setInterval(function() {
socket.emit('send:time', {
time: (new Date()).toString()
});
}, 1000);
return socket;
};
Dies funktioniert schön, wie ich hinzufügen möchte. Aber jetzt möchte ich in der Lage sein, Ereignisse von den verschiedenen Routen in meiner recht gewöhnlichen Express-App auszugeben, und ich kann nicht für den Rest von mir den richtigen Weg finden, einen Verweis auf das Socket-Objekt zu bekommen, das ich brauche.
Beispiel: Wenn ein Benutzer einen Kommentar abgibt, möchte ich ein Ereignis an alle verbundenen Benutzer senden, um sie über den neuen Kommentar zu informieren. Wie kann ich aus meiner routes-Datei (./server/routes/user.js
) Zugriff auf das Objekt erhalten, das ich zum Ausgeben von Ereignissen benötigen?
Hier ist ein Skelett der relevanten Bits aus einer Routendatei:
var express = require('express');
var router = express.Router();
router.post('/', function (req, res) {
...
});
module.exports = router;
Der einzige Ort, kann ich auf sie in der ../routes/socket.js
Datei ist, die nutzlos ist.
alle Routen sind in einem app.js
gesetzt, bevor Objekt jede io oder Buchse gibt es in zu übergeben.
Soll ich require('socket.io')
der Lage sein, und es verwenden, irgendwie an alle angeschlossenen Steckdosen zu emittieren?
Gibt es eine vernünftige Möglichkeit, die angeschlossenen Buchsen auf ../routes/socket.js
zu speichern, so dass es von anderen Routen benötigt und ausgegeben werden kann?
Kann mich jemand in die richtige Richtung lenken?
Von einer Route versuchen Sie, eine Nachricht an alle verbundenen Benutzer zu senden? Oder senden Sie nur an den Benutzer, der die Anfrage auf der Route gemacht hat? Wen versuchst du von deiner Route zu senden? 'io.emit (msg, data)' sendet an alle angeschlossenen Clients. Wenn Sie dies von einem anderen Modul aus tun, müssen Sie die 'io'-Variable mit diesem anderen Modul teilen. – jfriend00
Ich versuche, eine Nachricht an alle verbundenen Benutzer von einer Route aus zu senden. Beispiel: Ein Benutzer fügt einem Beitrag einen Kommentar hinzu. Ich möchte ein (namespaced) Ereignis an alle Benutzer senden, so dass jeder, der diesen Beitrag anzeigt, nach Aktualisierungen suchen kann und seine Seite mit dem neuen Kommentar aktualisiert wird. Ich weiß, ich muss das io-Objekt teilen, aber ich habe Mühe, den richtigen Weg zu finden, dies mit meinem Setup zu tun. – Nate
In diesem letzten Fall müssen Sie ein Singleton erstellen, das das Objekt zurückgibt oder global erzeugt. – Exos