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

时间:2017-04-27 00:14:13

标签: node.js sockets redis socket.io socket.io-redis

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

events.js:141       扔掉//未处理的错误'事件       ^ ReplyError:就绪检查失败:NOAUTH需要验证。     at parseError(/home/ubuntu/TekIT/ITapp/node_modules/redis-parser/lib/parser.js:193:12)     at 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
}));

有谁知道我收到此错误的原因?

1 个答案:

答案 0 :(得分:0)

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

此外,您应该致电client.auth('password1', ()=>{})函数。

检查这部分文档:

连接到需要身份验证的Redis服务器时,必须在连接后将AUTH命令作为第一个命令发送。与重新连接,准备检查等协调可能很棘手。为了使这更容易,client.auth()会保存密码并在每次连接后发送,包括重新连接。在对发送的第一个AUTH命令的响应之后,仅调用一次回调。注意:您对client.auth()的调用不应该在ready处理程序中。如果您这样做错误,客户端将发出类似于此错误的错误:就绪检查失败:不允许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
    }));
})