Socket.io émet des données en double après l'actualisation du browser

J'ai une page qui a un button. Lorsque le button est cliqué, il obtient des données via socket.io. Cependant, chaque fois que je recharge la page, socket.io va renvoyer une copy supplémentaire des données de l'set de données précédent. Donc, mes données sembleraient bien la première fois le chargement de la page (exemple: abcd). Puis recharger la page va récupérer 2n données (abcdabcd), recharger la page à nouveau je reçois des données 3n (abcdabcdabcd) etc.

Comment éviter l'envoi de données en double au client lors du rechargement de la page? Voici mon code.

Du côté server:

app.get('/test', function(req, res){ // some code... io.sockets.on("connection", function(socket){ var socketFn = function(data){ socket.emit("trends", { trends: JSON.parse(redisData) }); }; socket.on("action", socketFn); socket.on("disconnect", function(){ socket.removeListener("action", socketFn); // this doesn't work }); }); res.render('test'); }); 

Côté client:

  var socketOpts = { "sync disconnect on unload" : true }; var socket = io.connect("", socketOpts); socket.on("trends", function(data){ // data received from the node server, so do something with it }); function action(){ socket.emit("action", {phrase: "some dummy data"}); return false; } // already checked client side doesn't fire multiple click event $("button#click").off("click").on("click", action); 

C'est parce que vous écoutez la connection autant de fois que le client frappe la page.

 app.get('/test', function(req, res){ //when client opens the page io.sockets.on("connection", function(socket){ //start listning to new connection ... 

Il est considéré comme une mauvaise idée d'initialiser les écouteurs d'events de connection à partir de vos routes. Cela devrait être fait seulement une fois globalement. Ici, chaque fois que votre client accède à la page, il écoute les events autant de fois que la page est accessible.