1

Je suis avoir un diable d'une fois ici. J'ai lu tant de documentation et d'autres questions concernant le même sujet et je ne trouve pas de réponse sur la façon d'empêcher cela. J'arrête volontairement le serveur redis pour essayer de m'assurer que l'application ne passera pas complètement au nucléaire en production, mais rien de ce que je fais ne semble arrêter cela. Voici un exemple très simple de ce que mon code est en ce moment ...Redis-serveur se bloque en mode hors connexion nœud

var cluster = require('cluster'); 
var express = require('express'); 
var http = require('http'); 
var redis = require('redis'); 
var redisAdapter = require('socket.io-redis'); 
var sticky = require('sticky-session'); 
var port = process.env.PORT || 3333; 
var workers = 3; 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 

if(!sticky.listen(server, 3333, {workers: workers})) { 
    server.once('listening',() => { 
     console.log('server started on port ' + port); 
     process.on('exit',() => { 
      io.emit('error', {errorType: 'SERVER_SHUTDOWN'}); 
     }); 
     process.on('uncaughtException', (err) => { 
      console.log('uncaught exception occurred'); 
      console.log(err); 
     }); 
    }); 
} else { 
    addRedisAdapter(io); 
    addIOEventHandler(io); 
} 

function addRedisAdapter(io) { 
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379'; 
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); 
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true}); 
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true}); 
    io.on('error', (err) => { 
     console.log(err); 
    }); 
    io.on('uncaughtException', (err) => { 
     console.log(err); 
    }); 
    io.adapter(redisAdapter({pubClient: pub, subClient: sub})); 
    console.log('redis adapter started'); 
} 
function addIOEventHandler(io) { 
    //all the events for io 
} 

Maintenant, je commence à Redis-serveur, puis je commence à Node.js avec ce serveur. Puis j'appelle une fenêtre de terminal et je tape "redis-cli shutdown" pour forcer le serveur redis à se déconnecter. dès que je le fais, la fenêtre du terminal node.js se déconnecte à travers la même erreur encore et encore.

events.js:154 
    throw er; // Unhandled 'error' event 
^

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379 
    at Object.exports._errnoException (util.js:893:11) 
    at exports._exceptionWithHostPort (util.js:916:20) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1075:14) 
redis adapter started with url: redis://127.0.0.1:6379 

Je possède process.on ('uncaughtException' ... et io.on ('uncaughtException' ... ainsi qu'une io.on ('erreur', ... gestionnaire, mais tous les temps que le serveur se trouve juste là en disant qu'il y a une «erreur 'Unhandled' événement» Quelqu'un peut-il m'aider s'il vous plaît ici.Je ne vois pas comment cela peut éventuellement être une erreur non gérée, il n'a pas de sens dans mon esprit pour Merci d'avance pour toute aide possible que vous pouvez donner.J'y ai passé des interwebs pendant des heures à essayer de trouver une autre option possible et ils disent tous la même chose, utilisez io.on ('error', ou io.on ('uncaughtException', ou process.on ('uncaughtException', je les ai tous et il continue à faire des erreurs et se bloque le noeud.)

+1

essayer d'ajouter l'erreur de manipulation sur le client, i.e. pub.on ("erreur", (err) => {console.log (err)}); – SadiRubaiyet

+0

@SadiRubaiyet Je reçois un journal de la console quand j'ajoute le pub.on ('erreur' ... mais je reçois toujours une boucle et une erreur ... events.js: 154 throw er; // Unhandled 'erreur «événement ^ erreur: connexion Redis à 127.0.0.1:6379 échoué - connecter ECONNREFUSED 127.0.0.1:6379 à Object.exports._errnoException (util.js: 893: 11) à exports._exceptionWithHostPort (util.js : 916: 20) à TCPConnectWrap.afterConnect [comme oncomplete] (net.js: 1075: 14) –

+0

awesome man, heureux d'aider. En outre, vous pouvez utiliser client.end ou client .quit sur l'erreur ou même mettre en place une nouvelle tentative stratégie comme décrit sur la [page github du pilote] (https://github.com/NodeRedis/node_redis) – SadiRubaiyet

Répondre

3

Merci à @SadiRubaiyet pour m'avoir indiqué dans la bonne direction. J'ai dû ajouter un événement d'erreur à la fois pub et sub. Une fois que je l'ai fait, plus aucun nœud ne tombe en panne quand Redis tombe en panne. Voici le code édité ...

var cluster = require('cluster'); 
var express = require('express'); 
var http = require('http'); 
var redis = require('redis'); 
var redisAdapter = require('socket.io-redis'); 
var sticky = require('sticky-session'); 
var port = process.env.PORT || 3333; 
var workers = 3; 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 

if(!sticky.listen(server, 3333, {workers: workers})) { 
    server.once('listening',() => { 
     console.log('server started on port ' + port); 
     process.on('exit',() => { 
      io.emit('error', {errorType: 'SERVER_SHUTDOWN'}); 
     }); 
     process.on('uncaughtException', (err) => { 
      console.log('uncaught exception occurred'); 
      console.log(err); 
     }); 
    }); 
} else { 
    addRedisAdapter(io); 
    addIOEventHandler(io); 
} 

function addRedisAdapter(io) { 
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379'; 
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); 
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true}); 
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true}); 
    io.on('error', (err) => { 
     console.log(err); 
    }); 
    io.on('uncaughtException', (err) => { 
     console.log(err); 
    }); 
    /*HERE IS THE NEW CODE THAT MADE IT WORK*/ 
    pub.on('error', (err) => { 
     console.log('error from pub'); 
     console.log(err); 
    }); 
    sub.on('error', (err) => { 
     console.log('error from sub); 
     console.log(err); 
    }); 
    /*END*/ 
    io.adapter(redisAdapter({pubClient: pub, subClient: sub})); 
    console.log('redis adapter started'); 
} 
function addIOEventHandler(io) { 
    //all the events for io 
}