2016-03-21 19 views
1

Ich habe ein Problem, bei dem ein Benutzer die Verbindung trennt von socket.io und die Instanzen bleibt aktiv, einschließlich aller Ereignis Listener.Destroy socket.io Verbindung beim Trennen

Beide Beispiele unten sind Teilcode meines Fortschritts aufgrund von Hunderten von Zeilen. Aber das Problem bleibt bei diesem Code.

app.js Beispiel:

var express = require('express'), 
    app = express(), 
    routes = require('./routes/index'), 
    server = require('http').createServer(app); 

io = require('socket.io').listen(server); 

app.engine('handlebars', exphbs({ defaultLayout: 'main' })); 
app.set('view engine', 'handlebars'); 

app.use('/', routes); 

server.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

module.exports = app; 

index.js Route Beispiel:

var express = require('express'), 
    router = express.Router(); 

router.get('/', function(req, res) { 
    res.render('home', { 
     title: 'Home' 
    }); 

    setupSocket(req); 
}); 

function setupSocket(req) { 
    io.on('connection', function(socket) { 
     console.log('connected') 
    }); 
} 

module.exports = router; 

Dies führt zu:

Erste Verbindung:

connected 

Zweiter Anschluss :

connected 
connected 

dritte Verbindung:

connected 
connected 
connected 

Und so weiter. Dies wird beim erneuten Laden der Seite, auf einer neuen Registerkarte, in einem neuen Browser oder bei etwas anderem fortgesetzt, bis ich den Knotenserver neu starte.

In meinem Code posten ich Daten von der Client-Seite zu einer Mongo-Datenbank und aufgrund des oben genannten Problems wird die Anfrage mehrere Kopien der gleichen Daten veröffentlichen.

Die Frage ist also, wie verhindere ich, dass die Instanz aktiv bleibt, nachdem ein Benutzer die Seite verlassen hat?

+0

Mögliche doppelte: http://stackoverflow.com/questions/5048231/force-client-trennen-von-server-mit-socket-io-and-nodejs – Jer

+0

Danke, leider löst dies nicht das Problem, ich renne 'socket.on ('trennen', Funktion() {socket.disconnect();}); 'Aber wenn ich die Seite neu lade, stapelt es immer noch 'connected' in der Konsole –

Antwort

1

Wie Sie bei jeder Verbindung oder Aktualisierung sagen, erhalten Sie mehrere connected Strings Ausgänge, das ist, weil Sie socket.io Listener bei jeder Anfrage anhängen. Dies ist, wie Sie sollten die connected Hörer auf Ihrem socket.io befestigen:

var express = require('express'), 
    app = express(), 
    routes = require('./routes/index'), 
    server = require('http').createServer(app); 

io = require('socket.io').listen(server); 

app.engine('handlebars', exphbs({ defaultLayout: 'main' })); 
app.set('view engine', 'handlebars'); 

app.use('/', routes); 

// Your listener should be outside your routes 
io.on('connection', function(socket) { 
    console.log('connected') 
}); 

server.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

module.exports = app; 

Und auf Ihrem index.js nur die Setup-Funktion entfernen:

var express = require('express'), 
    router = express.Router(); 

router.get('/', function(req, res) { 
    res.render('home', { 
     title: 'Home' 
    }); 
}); 

module.exports = router; 
+0

Wie würden Sie dann einen Socket nur für eine bestimmte URL öffnen? – Yomo710

+0

Warum willst du das? Sie möchten, dass Ihr Socket-Server jedes Mal ausgeführt wird –

+0

Mein Socket startet eine andere Funktion, also wollte ich nur eine Socket-Verbindung für eine bestimmte URL registrieren. Ich habe es unter den URL-Anfrage-Block gestellt, habe aber das gleiche Problem wie OP. – Yomo710

Verwandte Themen