0

我正在尝试连接到受密码保护的 redis 服务器,但由于某种原因,我不断收到错误消息:

events.js:141 抛出错误;// 未处理的 'error' 事件 ^ ReplyError: Ready check failed: NOAUTH Authentication required. 在 parseError (/home/ubuntu/TekIT/ITapp/node_modules/redis-parser/lib/parser.js:193:12) 在 parseType (/home/ubuntu/TekIT/ITapp/node_modules/redis-parser/lib/parser. js:303:14)

我知道密码是正确的,因为我在 redis-cli 中尝试过,它工作正常。下面是代码:

var redis = require('redis');

var client = redis.createClient(redisPort, redisHostname, { auth_pass: 'password1' });


var redisSubscriber = redis.createClient(redisPort, redisHostname, { auth_pass: 'password1' });




// Create and use a Socket.IO Redis store
var RedisStore = require('socket.io-redis');
io.set('store', new RedisStore({
    redisPub: client,
    redisSub: redisSubscriber,
    redisClient: client
}));

有谁知道我为什么会收到这个错误?

4

1 回答 1

0

socket.io-redis您应该在事件发生后初始化ready

你也应该调用client.auth('password1', ()=>{})函数。

检查这部分文档:

当连接到需要认证的 Redis 服务器时,AUTH 命令必须作为连接后的第一个命令发送。这可能很难与重新连接、就绪检查等进行协调。为了使这更容易,client.auth() 存储密码并在每次连接后发送它,包括重新连接。在对发送的第一个 AUTH 命令的响应之后,回调仅被调用一次。注意:您对 client.auth() 的调用不应在就绪处理程序中。如果你做错了,客户端会发出一个看起来像这样的错误 Error: Ready check failed: ERR operation not allowed。

试试这个代码:

var redis = require('redis');
const redisPort = 6379
const redisHostname = 'localhost'
const password = 'password1'

var p1 = new Promise((resolve, reject)=>{
    var client = redis.createClient(redisPort, redisHostname, { auth_pass: 'password1' });
    client.auth(password)
    client.on('ready', ()=>{
        resolve(client)
    })
})

var p2 = new Promise((resolve, reject)=>{
    var redisSubscriber = redis.createClient(redisPort, redisHostname, { auth_pass: 'password1' });
    redisSubscriber.auth(password)
    redisSubscriber.on('ready', ()=>{
        resolve(redisSubscriber)
    })
})

Promise.all([p1,p2]).then(([client, redisSubscriber])=>{
    console.log('done', client)
    client.ping((err, data)=>{
        console.log('err, data', err, data)
    })

    // Create and use a Socket.IO Redis store
    var RedisStore = require('socket.io-redis');
    io.set('store', new RedisStore({
        redisPub: client,
        redisSub: redisSubscriber,
        redisClient: client
    }));
})
于 2017-04-27T08:03:03.083 回答