1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-06 02:15:48 +03:00

fix(handshake): ignore errors on client.setinfo (#2969)

As per the documentation (https://redis.io/docs/latest/commands/client-setinfo):

Client libraries are expected to pipeline this command after authentication on all connections and ignore failures since they could be connected to an older version that doesn't support them.

Turns out different versions of redis server return different errors, so its better to catch all.

fixes #2968
This commit is contained in:
Nikolay Karadzhov
2025-05-21 11:38:29 +03:00
committed by GitHub
parent b8acbce213
commit 9ea260f0f9
2 changed files with 10 additions and 22 deletions

View File

@@ -4,7 +4,7 @@ import { BasicAuth, CredentialsError, CredentialsProvider, StreamingCredentialsP
import RedisCommandsQueue, { CommandOptions } from './commands-queue'; import RedisCommandsQueue, { CommandOptions } from './commands-queue';
import { EventEmitter } from 'node:events'; import { EventEmitter } from 'node:events';
import { attachConfig, functionArgumentsPrefix, getTransformReply, scriptArgumentsPrefix } from '../commander'; import { attachConfig, functionArgumentsPrefix, getTransformReply, scriptArgumentsPrefix } from '../commander';
import { ClientClosedError, ClientOfflineError, DisconnectsClientError, SimpleError, WatchError } from '../errors'; import { ClientClosedError, ClientOfflineError, DisconnectsClientError, WatchError } from '../errors';
import { URL } from 'node:url'; import { URL } from 'node:url';
import { TcpSocketConnectOpts } from 'node:net'; import { TcpSocketConnectOpts } from 'node:net';
import { PUBSUB_TYPE, PubSubType, PubSubListener, PubSubTypeListeners, ChannelListeners } from './pub-sub'; import { PUBSUB_TYPE, PubSubType, PubSubListener, PubSubTypeListeners, ChannelListeners } from './pub-sub';
@@ -626,14 +626,10 @@ export default class RedisClient<
if (!this.#options?.disableClientInfo) { if (!this.#options?.disableClientInfo) {
commands.push({ commands.push({
cmd: ['CLIENT', 'SETINFO', 'LIB-VER', version], cmd: ['CLIENT', 'SETINFO', 'LIB-VER', version],
errorHandler: (err: Error) => { errorHandler: () => {
// Only throw if not a SimpleError - unknown subcommand // Client libraries are expected to pipeline this command
// Client libraries are expected to ignore failures // after authentication on all connections and ignore failures
// of type SimpleError - unknown subcommand, which are // since they could be connected to an older version that doesn't support them.
// expected from older servers ( < v7 )
if (!(err instanceof SimpleError) || !err.isUnknownSubcommand()) {
throw err;
}
} }
}); });
@@ -646,14 +642,10 @@ export default class RedisClient<
? `node-redis(${this.#options.clientInfoTag})` ? `node-redis(${this.#options.clientInfoTag})`
: 'node-redis' : 'node-redis'
], ],
errorHandler: (err: Error) => { errorHandler: () => {
// Only throw if not a SimpleError - unknown subcommand // Client libraries are expected to pipeline this command
// Client libraries are expected to ignore failures // after authentication on all connections and ignore failures
// of type SimpleError - unknown subcommand, which are // since they could be connected to an older version that doesn't support them.
// expected from older servers ( < v7 )
if (!(err instanceof SimpleError) || !err.isUnknownSubcommand()) {
throw err;
}
} }
}); });
} }

View File

@@ -70,11 +70,7 @@ export class ErrorReply extends Error {
} }
} }
export class SimpleError extends ErrorReply { export class SimpleError extends ErrorReply {}
isUnknownSubcommand(): boolean {
return this.message.toLowerCase().indexOf('err unknown subcommand') !== -1;
}
}
export class BlobError extends ErrorReply {} export class BlobError extends ErrorReply {}