options = {
'auth_pass': nconf.get('redis_pass')[nodeEnv],
'no_ready_check': true,
};
redis-cli
ツールを使用してredisに接続すると、問題なく動作しますが、何らかの理由でこのエラーが発生しています
29 Jun 2018 11:06:14.626136 <190>1 2018-06-29T18:06:14.346750+00:00 app web.1 - - ReplyError: NOAUTH Authentication required
at new Command (/app/node_modules/redis/lib/command.js:12:22)
at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
at Object.onceWrapper (events.js:313:30)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1173:10)Exception
options
オブジェクトだけから見分けるのは難しいですが、これはかなり標準的であり、よく知られています。 おそらく、間違ったRedisサーバーに接続しているか、 nconf.get('redis_pass')[nodeEnv]
が間違ったパスワードを提供している(または未定義である)可能性があります。
より多くのコードを提供できますか?
こんにちは、私は同じ問題を抱えており、パスワードをプレーンテキストとして渡しますが、それでも同じエラーが送信されます。 実際、次のコードに示すように、デフォルトのredis.confファイルのrequirepass行のコメントを外すだけです。
# use a very strong password otherwise it will be very easy to break.
#
requirepass foobared
# Command renaming.
テストを行うためにローカルマシンでこの構成を行いますが、それでも同じエラーが発生します。
events.js:160
throw er; // Unhandled 'error' event
^
ReplyError: Ready check failed: NOAUTH Authentication required.
at parseError (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:193:12)
at parseType (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:303:14)
nodejsサーバーに適用するコードは次のとおりです。
const redisPassword = "foobared" ;
const ClientRedisApi = redis.createClient({
host : '127.0.0.1',
no_ready_check: true,
auth_pass: redisPassword,
});
ClientRedisApi.on('connect', () => {
global.console.log("connected");
})
ClientRedisApi.on('error', err => {
global.console.log(err.message)
})
ClientRedisApi.set("foo", 'bar');
ClientRedisApi.get("foo", function (err, reply) {
global.console.log(reply.toString())
})
面白いことに、サーバーを起動すると、キー「foo」が値「bar」でredisデータベースに保存されますが、アプリがクラッシュし、それを操作するために何もできません。
ここのみんなに。 Linuxのランダムパスワードジェネレーターによって生成された長いパスワードを使用しようとしたときにも同じ問題が発生しました。 パスワードをもっと短いものに変更すると、すべてが正常に機能しました。 これは、このNode.JSパッケージ自体に問題がある可能性があります。これは、 redis-cliにアクセスして、 authコマンドで使用した場合に長いパスワードが機能したためです。 ただし、 createClient()メソッドで渡された場合、使用したメソッドバリアント(つまり、完全なURL、オプションブロックの "auth_pass" / "password"、またはredisClient.auth())に関係なく、まったく同じパスワードは機能しませんでした。メソッド-それらはすべて長いパスワードで失敗しました)。
こんにちは@roschler 、コードを提供してください。 真実は私があなたの提案を試みたということです、そして私はまだ同じ問題を抱えています、「123」のようなパスワードでさえ。 私はドキュメントにあるすべての方法で試してみましたが、何も変わりません。 これはあなたに迷惑をかける可能性があることを私は知っていますが、本当は私には他の選択肢がないということです。 よろしくお願いします。
@maooricioこれはサーバーの設定ミスまたは間違ったサーバーであると99.999%確信しています。 2018年10月のコードを見て、ランダムに生成されたキーを使用して、 redis-cli
のMONITORでエコーしてみます。
@roschlerはまったく別の問題を抱えていると思います(引用?)
私はまだこの問題が発生しています私はredisデータベースに接続するために非常に多くの異なる方法を試しましたが、ユーザーのパスワード認証に失敗しました
@nicollasmatheusあなたのエラーは何ですか?
同じエラーが発生しています。 すべての設定パラメータが正しいと確信しています。 私は3つの方法すべてを試しましたが、すべて同じエラーが発生しました。
// First method
const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST);
client.auth(process.env.REDIS_PASSWORD);
// Second method
const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
password: process.env.REDIS_PASSWORD
});
// Third method
const client = redis.createClient(uri)
設定後NODE_DEBUG=redis
[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Stream connected redis:6379 id 0
[0] Redis: CONNECTED // CUSTOM MESSAGE
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Redis: READY // CUSTOM MESSAGE
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0] this.error = new Error();
[0] ^
[0] ReplyError: NOAUTH Authentication required.
[0] at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0] at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0] at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0] at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0] at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0] at Object.onceWrapper (events.js:299:28)
[0] at Socket.emit (events.js:215:7)
[0] at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)
[0] npm ERR! code ELIFECYCLE
docker-composeを使用しています
redis:
container_name: redis
image: redis:5.0.3-alpine
restart: always
env_file: .env
command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"]
hostname: ${REDIS_HOST}
volumes:
- ~/.mydata/redis:/data
ports:
- ${REDIS_PORT}:6379
networks:
- my-network
cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'
を使用してredisにアクセスできます
@thellimist redis-cli
とMONITOR
で何が起こっているか、特に2番目の方法で何が起こっているかを確認してください。
@stockholmux
export default class Cache {
static client: any
static init(): Promise<any> {
if (Cache.client) {
logger.error("Client already exists")
return new Promise((resolve, reject) => { reject() });
}
const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
password: process.env.REDIS_PASSWORD
});
Cache.client = asyncRedis.decorate(client);
Cache.client.monitor(function (err, res) {
logger.info("Entering monitoring mode.");
});
Cache.client.set('foo', 'bar');
Cache.client.on("ready", (e: any) => {
logger.info(`ready ${e}`);
});
Cache.client.on("reconnecting", (e: any) => {
logger.info(`reconnecting ${e}`);
});
Cache.client.on("end", (e: any) => {
logger.info(`end ${e}`);
});
Cache.client.on("warning", (e: any) => {
logger.info(`warning ${e}`);
});
Cache.client.on("monitor", (e: any, res: any) => {
logger.error(`monitor err: ${e}`);
logger.info(`monitor res: ${res}`);
});
Cache.client.on("connect", () => {
logger.info("connected");
});
Cache.client.on("error", (e: any) => {
logger.error(`Error: :${e}`);
});
return new Promise((resolve, reject) => { resolve() }
}
そして私はawait Cache.init()
と呼びます。 応答は次のとおりです。
[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Queueing monitor for next server connection.
[0] Queueing set for next server connection.
[0] Stream connected redis:6379 id 0
[0] 2019-12-17 06:49:48 error [server.ts]: connected
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Sending offline command: monitor
[0] Send redis:6379 id 0: *1
[0] $7
[0] monitor
[0]
[0] Sending offline command: set
[0] Send redis:6379 id 0: *3
[0] $3
[0] set
[0] $3
[0] foo
[0] $3
[0] bar
[0]
[0] 2019-12-17 06:49:48 info [server.ts]: ready undefined
[0] Net read redis:6379 id 0
[0] 2019-12-17 06:49:48 info [server.ts]: Entering monitoring mode.
[0] 2019-12-17 06:49:48 error [server.ts]: monitor err: 1576565388.385183
[0] 2019-12-17 06:49:48 info [server.ts]: monitor res: set,foo,bar
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0] this.error = new Error();
[0] ^
[0] ReplyError: NOAUTH Authentication required.
[0] at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0] at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0] at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0] at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0] at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0] at Object.onceWrapper (events.js:299:28)
[0] at Socket.emit (events.js:215:7)
[0] at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)
また、key / val "foo:bar"がredisに追加されます。 したがって、最初は正しく接続し、その後何らかの理由で再接続を試みますが失敗します。 Express server.listenでawait Cache.init()
を1回だけ呼び出します。
@thellimist誤解していると思います。これらの問題を適切に診断するには、 MONITOR
_from_ redis-cli
を実行する必要があります。 上記のようにアプリケーション内から実行すると、認証は取得されません(MONITORの前に行われるため)。 また、完全にフラッシュされたDBで実行します。
とにかく、コード(私はスニペットだと思います)を見ると、適切なパスワードなしでredis.createClient
を呼び出しているコードの他の場所のように見えます(おそらく別のモジュールでも)。 再接続のデバッグログが表示されず、 id 1
は別のネットワークストリームで作業していることを示しています。
@stockholmux
あなたが言ったように、問題は単純でした。 typeormパッケージを使用していましたが、js/tsファイルにない別の構成ファイルがありました。 Node Redis logeは、どこから呼び出されているのかを教えてくれなかったため、見つけるのが困難でした。
ありがとう。
Dockerを使用している場合は、redis.confのファイルネットワーク設定を編集します。
bind 0.0.0.0
それは私のためにそれを修正しました。
@mariothedevはそれについて非常に注意してください。 適切なファイアウォールがない場合、redisはそのbind
設定を使用して広く開かれます。
@stockholmux-教えてくれてありがとう:)
私もここでこの問題を抱えています。
エラーメッセージ: ReplyError: NOAUTH Authentication required.
バージョン:Node Redis 3.0.0 / Redis 5.0.8
同じ問題への答えを探してこのスレッドに出くわしました。 これに対する解決策は何か疑問に思います。
リストに追加するもう1つの可能な解決策。 このエラーが発生し、RedisベースのキューであるBullを使用していることを思い出すのに非常に長い時間がかかりました。 また、接続情報を渡していたアプリケーションの他の場所でRedisを使用していますが、Bullのことを忘れており、コンソールでこれらのエラーが発生していました。
したがって、もう1つ確認する必要があるのは、アプリ内の他の何かがRedisを使用していて、これらのエラーを再発させている可能性があるかどうかです。
編集このエラーの原因がBullの場合は、 auth_pass
ではなく、redis接続オブジェクトでpassword
を使用する必要があります。
最も参考になるコメント
私もここでこの問題を抱えています。
エラーメッセージ:
ReplyError: NOAUTH Authentication required.
バージョン:Node Redis 3.0.0 / Redis 5.0.8