redis-server脱机崩溃节点

我在这里有一段时间。 我已经阅读了大量的文档和其他民族关于同一主题的问题,无法find如何阻止这种情况发生的答案。 我有意closuresredis服务器,以确保应用程序在生产中不会完全走向核心,但是我所做的任何事似乎都阻止了这种情况的发生。 这里是我的代码现在是一个非常简单的例子…

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 } 

现在,我启动redis-server,然后用这个服务器启动node.js。 然后我popup一个terminal窗口并input“redis-cli shutdown”来强制Redis服务器脱机。 只要我这样做node.jsterminal窗口坚持循环遍历相同的错误。

 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 

我有两个process.on('uncaughtException'…和io.on('uncaughtException'…以及一个io.on('错误',…处理程序,但每当服务器坐在那里循环说有一个“未处理的错误”事件“有人​​可以帮我在这里,我不明白这可能是未经处理的错误,因为某种原因在我的脑海里没有任何意义。任何可能的帮助,你可以给我几个小时试图find任何其他可能的选项,他们都说同样的事情,使用io.on('错误',或io.on('uncaughtException',或process.on('uncaughtException',我有他们所有,它仍然错误和崩溃节点。

感谢@SadiRubaiyet指引我正确的方向。 我不得不添加一个错误事件到pub和sub。 一旦我这样做了,当redis出现故障时,不会有更多的节点崩溃。 这里是编辑的代码…

 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 }