options = {
'auth_pass': nconf.get('redis_pass')[nodeEnv],
'no_ready_check': true,
};
إذا اتصلت بـ redis باستخدام الأداة redis-cli
فإنها تعمل بشكل جيد ولكن لسبب ما تلقيت هذا الخطأ
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 الافتراضي ، كما أعرض في الكود التالي:
# 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" في قاعدة بيانات redis الخاصة بي باستخدام "شريط" القيمة ، ولكن تطبيقي يتعطل ولا يمكنني فعل أي شيء للتفاعل معه.
للجميع هنا. واجهت نفس المشكلة عندما حاولت استخدام كلمة مرور طويلة تم إنشاؤها بواسطة منشئ كلمات المرور العشوائية في Linux. عندما قمت بتغيير كلمة المرور إلى شيء أقصر بكثير ، كان كل شيء يعمل بشكل جيد. قد تكون هذه مشكلة في حزمة Node.JS نفسها ، لأن كلمة المرور الطويلة تعمل إذا ذهبت إلى redis-cli واستخدمتها مع الأمر auth . ومع ذلك ، لم تعمل نفس كلمة المرور بالضبط عند تمريرها أثناء طريقة createClient () ، بغض النظر عن متغير الطريقة الذي استخدمته (على سبيل المثال - عنوان URL الكامل ، أو "auth_pass" / "password" في كتلة الخيارات ، أو redisClient.auth () الطريقة - فشلوا جميعًا مع كلمة المرور الطويلة).
مرحبًا @ roschler ، هل ترغب في تقديم الرمز الخاص بك من فضلك. الحقيقة هي أنني جربت اقتراحك وما زلت أواجه نفس المشكلة ، ولا حتى مع كلمة مرور مثل "123". أحاول بكل الطرق الموجودة في التوثيق ولا شيء مختلف. أعلم أن هذا يمكن أن يزعجك ولكن الحقيقة هي أنه ليس لدي خيار آخر. مقدما شكرا جزيلا.
maooricio أنا متأكد بنسبة 99.999٪ أن هذا خطأ في التكوين في الخادم أو الخادم الخطأ. بالنظر إلى الكود الخاص بك من أكتوبر 2018 ، سأحاول استخدام مفتاح تم إنشاؤه عشوائيًا وترديد الصدى مع MONITOR في redis-cli
.
أعتقد أن @ roschler تواجه مشكلة مختلفة تمامًا (اقتباس؟)
ما زلت أواجه هذه المشكلة معي ، لقد جربت العديد من الطرق المختلفة للاتصال بـ redis db الخاص بي ولكن فشل المصادقة على كلمة المرور للمستخدم
nicollasmatheus ما هو خطأك؟
أواجه نفس الخطأ. أنا واثق من صحة جميع معلمات الإعداد. لقد جربت جميع الطرق الثلاثة ونفس الخطأ في كل منهم.
// 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
أنا أستخدم عامل بناء السفن
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
ويمكنني الوصول إلى redis باستخدام cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'
thellimist تحقق مما يحدث مع redis-cli
و MONITOR
، خاصة مع طريقتك الثانية.
تضمين التغريدة
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. لذلك يتم الاتصال بشكل صحيح في البداية ثم لسبب ما يحاول إعادة الاتصال ولكنه يفشل. أنا أتصل فقط بـ await Cache.init()
مرة واحدة في express.listen.
thellimist أعتقد أنك تسيء الفهم - تحتاج إلى تشغيل MONITOR
_from_ redis-cli
لتشخيص هذه المشكلات بشكل صحيح. لن يؤدي تشغيله من داخل تطبيقك كما هو مذكور أعلاه إلى التقاط المصادقة (لأنه يحدث قبل المراقبة). أود أيضًا تشغيله على قاعدة بيانات متدفقة تمامًا.
على أي حال ، بالنظر إلى الكود الخاص بك (الذي أفترض أنه مقتطف) ، يبدو حقًا أنه في مكان آخر في الكود الخاص بك تتصل بـ redis.createClient
بدون كلمة المرور المناسبة (ربما وحدة أخرى). لا أرى سجلات تصحيح الأخطاء لإعادة الاتصال ويقول id 1
أنك تعمل على دفق شبكة مختلف.
تضمين التغريدة
كانت القضية بسيطة كما قلت. كنت أستخدم حزمة 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
جاء عبر هذا الموضوع باحثًا عن إجابة لنفس المشكلة. أتساءل ما هو الحل لهذا.
قرار آخر ممكن لإضافته إلى القائمة. لقد تلقيت هذا الخطأ واستغرق الأمر وقتًا طويلاً محرجًا لأتذكر أنني أستخدم Bull وهي قائمة انتظار تستند إلى Redis. أنا أستخدم Redis أيضًا في مكان آخر في التطبيق حيث كنت أقوم بتمرير معلومات الاتصال ، لكنني نسيت أمر Bull وكنت أتلقى هذه الأخطاء بالضبط على وحدة التحكم.
لذلك أعتقد أن هناك شيئًا آخر يجب التحقق منه وهو ما إذا كان أي شيء آخر في تطبيقك يستخدم Redis وربما يعيد تشغيل هذه الأخطاء.
تحرير إذا كان Bull هو الذي تسبب في هذا الخطأ بالنسبة لك ، فيجب عليك استخدام password
في كائن اتصال redis ، وليس auth_pass
.
التعليق الأكثر فائدة
أواجه هذه المشكلة هنا أيضًا.
رسالة الخطأ:
ReplyError: NOAUTH Authentication required.
الإصدار : Node Redis 3.0.0 / Redis 5.0.8