Ich habe einen node.js-Server, der beim Booten mit Ubuntus upstart
beginnt. Da der node.js-Server gestartet wird, bevor Redis ausgeführt wird, löst redis.createClient()
eine Ausnahme aus:
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused
at Socket.<anonymous> (/var/www/php-jobs/node_modules/redis/index.js:88:28)
at Socket.emit (events.js:64:17)
at Array.<anonymous> (net.js:830:27)
at EventEmitter._tickCallback (node.js:126:26)
Natürlich versuche ich es in eine try / catch-Anweisung zu packen. Der Start meines Servers:
var redis = require("redis");
function initializeRedis(callback) {
(function createClient(){
var client;
try {
client = redis.createClient();
} catch (e) {
setTimeout(createClient, 1000);
}
callback(client);
})();
};
initializeRedis(function(client) {
// Do things with client
});
Dies macht jedoch keinen Unterschied, ich habe immer noch eine Ausnahme. Was kann der Fall sein und wie kann ich sicherstellen, dass mein Server wartet, bevor Redis da ist?
Dies geschieht, weil der Client ein "Fehler" -Ereignis ausgibt. Im Knoten sind Ereignisse mit dem Namen "Fehler" etwas Besonderes. Wenn Sie nicht auf sie hören, werden sie in Ausnahmen umgewandelt. Holen Sie sich also einen Listener für "Fehler" auf Ihrem Client, und Sie werden nicht abstürzen. Wir versuchen es automatisch erneut, wenn die Verbindung abgelehnt wurde. Dies sollte sich also von selbst einstellen, sobald Sie auf Fehler warten.
Ich werde die Art und Weise, wie Wiederverbindungen und Fehler behandelt werden, überarbeiten, da dieses sehr häufige Szenario für viele Menschen verwirrend ist.
Wurde irgendetwas davon gehandhabt? Ich versuche, die Fehler in einem Try-Catch-Block abzufangen. Aber es funktioniert nicht.
const client = redis.createClient ({
Host: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('connect', () => {
logger.info ('Erfolgreich mit redis verbunden');
})
Dies wird also weiterhin abgefragt, um eine Verbindung zum Redis-Server herzustellen, und wenn eine Verbindung gefunden wird, wird automatisch eine Verbindung hergestellt. Vielen Dank an @mranney für eine schnelle Lösung
Hilfreichster Kommentar
const client = redis.createClient ({
Host: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('connect', () => {
logger.info ('Erfolgreich mit redis verbunden');
})
Dies wird also weiterhin abgefragt, um eine Verbindung zum Redis-Server herzustellen, und wenn eine Verbindung gefunden wird, wird automatisch eine Verbindung hergestellt. Vielen Dank an @mranney für eine schnelle Lösung