【问题标题】:socket.io-redis keeps throwing NOAUTH errorsocket.io-redis 不断抛出 NOAUTH 错误
【发布时间】:2017-09-24 14:05:51
【问题描述】:

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

events.js:141 投掷者; // 未处理的“错误”事件 ^ 回复错误:就绪检查失败:需要 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
}));

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

【问题讨论】:

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


    【解决方案1】:

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

    你也应该调用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
        }));
    })
    

    【讨论】:

    • 好的,那么我将如何在准备好的事件后初始化 socket.io-redis?这是我应该怎么做的吗? var redisSubscriber = redis.createClient(redisPort, redisHostname); redisSubscriber.auth('password1', function (err) { if (err) throw err; else { // 创建和使用一个 Socket.IO Redis store RedisStore = require('socket.io-redis'); io.set( 'store', new RedisStore({ redis: redis, redisPub: client, redisSub: redisSubscriber, redisClient: client })); } });
    • 你能给我一个正确的例子吗?
    • 或者你的意思是这样的:client.on('ready', function () { redisSubscriber.on('ready', function () { console.log("Everything Ready!"); // 创建并使用一个 Socket.IO Redis store RedisStore = require('socket.io-redis'); io.set('store', new RedisStore({ redis: redis, redisPub: client, redisSub: redisSubscriber, redisClient:客户端 })); }) })
    • 请一分钟,我会成功的
    • 成功了!!!非常感谢,我一直在开车想弄清楚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2014-09-21
    • 2015-05-03
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多