Błędy połączenia są zgłaszane jako error
zdarzenie na kliencie Redis
obiekt.
Zgodnie z sekcją „Automatyczne ponowne łączenie” w dokumentacji, ioredis automatycznie spróbuje ponownie połączyć się, gdy połączenie z Redis zostanie utracone (lub prawdopodobnie nie będzie można nawiązać w pierwszej kolejności). Dopiero po maxRetriesPerRequest
próby czy oczekujące polecenia "zostaną opróżnione z błędem", tj. dostaną się do catch
tutaj:
try {
cachedItem = await redisClient.get(queryString); // This emit an error on the redis client, because it fails to connect (that's intended, to test the behaviour)
} catch (e) {
logger.error(e); // It never goes there, as the error isn't "thrown", but rather "emitted" and handled by redis its own way
epsagon.setError(e);
}
Ponieważ zatrzymujesz program po pierwszym błędzie:
client.on('error', function (e) {
// ...
if (e.message === 'ERR invalid password') {
logger.error(`Fatal error occurred "${e.message}". Stopping server.`);
throw e; // Fatal error, don't attempt to fix
...ponowne próby i następujące po nim „opróżnienie z błędem” nigdy nie mają szansy na uruchomienie.
Zignoruj błędy w client.on('error'
i powinieneś otrzymać błąd zwrócony przez await redisClient.get()
.