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

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

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

events.js:141 扔呃;//未处理的“错误”事件 ^ 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
    }));
})

关于node.js - socket.io-redis 不断抛出 NOAUTH 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43646577/

相关文章:

c# - 如何使用C#套接字发送内存流?

一个项目的NoSQL推荐(文本流)

Redis-cli --csv 选项(导出到 csv)

go - 为什么redigo返回ERR unknown command 'EVALSHA'

javascript - 如何从 Service Worker 调用缓存的 ManifestEntry Javascript 函数?

javascript - Nestjs 无法解决依赖关系

node.js - Cheerio 中的 get() 函数有什么作用?

sockets - Lambda + API网关: Long executing function return before task finished

java.net.SocketException : Connection reset

node.js - 'collection#find: pass a function instead, Tags.create is not a function' 的原因