socket.io-redis 不断抛出 NOAUTH 错误

socket.io-redis keeps throwing NOAUTH error

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

events.js:141 扔呃; // 未处理的 'error' 事件 ^ ReplyError:就绪检查失败:需要 NOAUTH 身份验证。 在 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
}));

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

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

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

查看这部分文档:

当连接到需要身份验证的Redis 服务器时,AUTH 命令必须作为连接后的第一个命令发送。这可能很难与重新连接、就绪检查等协调。为了使这更容易,client.auth() 隐藏密码并在每次连接后发送它,包括重新连接。在对第一个 AUTH 命令发送的响应之后,回调仅被调用一次。注意:您对 client.auth() 的调用不应在就绪处理程序内。如果你做错了,客户端会发出类似这样的错误错误:就绪检查失败:不允许进行 ERR 操作。

试试这个代码:

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
    }));
})