2

私はここで楽しい時間を過ごしています。私は非常に多くのドキュメントを読み、同じトピックに関する他の人々の質問を読みましたが、これが起こらないようにする方法についての答えを見つけることができません. 私は意図的に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-server を起動し、このサーバーで 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('uncaughtException' ... と io.on('uncaughtException' ... と io.on('error', ... ハンドラー) の両方を持っていますが、サーバーがそこにループするたびに「未処理の「エラー」イベントがあると言っています。誰かがここで私を助けてくれますか。これがどのように未処理のエラーになるのかわかりません。何らかの理由で意味がありません。よろしくお願いします。私は他の可能なオプションを見つけようとして何時間もインターウェブに行ってきましたが、それらはすべて同じことを言います, io.on('error', or io.on('uncaughtException', or process.on('uncaughtException', 私はそれらをすべて持っていますが、それでもエラーが発生し、ノードがクラッシュします。

4

2 に答える 2