redis服务器脱机使节点崩溃
redis-server offline crashes node
我在这里玩得很开心。我读了太多关于同一主题的文件和其他人的问题,却找不到如何阻止这种情况发生的答案。我有意关闭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);
});
io.adapter(redisAdapter({pubClient: pub, subClient: sub}));
console.log('redis adapter started');
}
function addIOEventHandler(io) {
//all the events for io
}
现在,我启动redis服务器,然后用这个服务器启动node.js。然后,我打开一个终端窗口,输入"redis-cli shutdown"以强制redis服务器脱机。一旦我这样做了,node.js终端窗口就会一次又一次地通过相同的错误循环。
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('ncaughtException'…和io.on('ncaughtException'…以及io.on)('error',…处理程序,但每次服务器都在那里循环说有一个"未处理的'错误'事件"有人能帮帮我吗。我不明白这怎么可能是一个未经处理的错误,出于某种原因,它在我心中没有意义。提前感谢您提供的任何可能的帮助。我已经在网络间工作了几个小时,试图找到任何其他可能的选项,但他们都说了同样的话,使用io.on('error',或io.oon('ncaughtException',或process.on('ncaughtException',我都有了,它仍然会出错并崩溃节点。
感谢@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
}
我使用以下行解决了此问题:
io.of('/').adapter.on('error', function(error){
console.log('error: ', error);
});
相关文章:
- 节点导出返回一个空对象
- 可以前端maven插件使用节点,npm已经安装
- 在jstree中,如何将指定的节点集中到大型树上
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- 如何处理node.js节点mongodb中的连接和查询队列
- 将DOM节点值与字符串Javascript进行比较
- 节点fs.stat名称未定义
- redis服务器脱机使节点崩溃
- 节点.js - 事件.js:154 抛出错误写入 EPIPE;程序崩溃
- D3js:力导向,内部节点崩溃
- 节点红色崩溃/JSON输出有时会返回html
- 节点web服务器崩溃
- node .js -启动命令使节点崩溃,但index.js运行正常
- 发生重复注册时,节点快车服务器崩溃
- 防止节点类型错误使应用程序崩溃
- 当尝试在节点集群后扩展时,Phantomjs-node崩溃