Node-Redis:就绪检查失败 - 需要 NOAUTH 身份验证

Posted

技术标签:

【中文标题】Node-Redis:就绪检查失败 - 需要 NOAUTH 身份验证【英文标题】:Node-Redis: ready check failed - NOAUTH Authentication required 【发布时间】:2018-01-22 04:15:05 【问题描述】:

我有一个奇怪的 redis 行为:

const redis = require('redis');
const  REDIS_URL: redisUrl, REDIS_PASSWORD: redisPassword  = process.env;

const client = redis.createClient(redisUrl, 
  no_ready_check: true,
  auth_pass: redisPassword
);

client.on('connect', () => 
  redisPassword && client.auth(redisPassword);
);

client.on('error', err => 
  global.console.log(err.message)
);

但我一直收到以下错误:

投掷者; // 未处理的“错误”事件

ReplyError:就绪检查失败:需要 NOAUTH 身份验证。

为什么未处理?我设置 onerror 处理程序 为什么就绪检查失败?我在选项中禁用

【问题讨论】:

【参考方案1】:

我不确定你的代码为什么会抛出这个错误。但是我在本地机器上尝试了这段代码,效果很好。

const redis = require('redis');
const redisPassword = "password" ; 
const client = redis.createClient(
          host : '127.0.0.1',  
          no_ready_check: true,
          auth_pass: redisPassword,                                                                                                                                                           
);                               
                                  
client.on('connect', () =>    
          global.console.log("connected");
);                               
                                  
client.on('error', err =>        
          global.console.log(err.message)
);                               
                                  
client.set("foo", 'bar');         
                                  
client.get("foo", function (err, reply) 
        global.console.log(reply.toString())
)

运行 node client.js 会输出:

已连接

酒吧

NOAUTH Authentication required 是由于 redis process 命令时发现客户端未通过身份验证,因此抱怨它。

我猜你给 createClient 的 redisUrl 可能有问题,尝试调试它或更改为我的代码的方式尝试。希望你能解决它。

还有一件事:client.auth(redisPassword) 不是必需的,因为如果您设置 auth_pass 或密码选项,redis 客户端将在任何命令之前自动向服务器发送 auth 命令。

【讨论】:

感谢您提供有关 auth_pass 选项的建议。这很有用。至于问题 - 我用 redis 重新创建了一个实例(我们在它的引擎盖下使用 flynn 和 heroku)现在它可以工作了 您好,我遵循您的相同代码,但它仍然向我发送相同的错误。但我意识到它在我的数据库中创建了密钥,但它不允许运行我的应用程序。我能做些什么? Mi错误如下:ReplyError:就绪检查失败:NOAUTH需要身份验证。在 parseError (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis-parser/lib/parser.js:193:12) 在 parseType (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis-parser/ lib/parser.js:303:14) 你的redis服务器配置对了吗? requirepass 和保护模式【参考方案2】:

如果您将 redis uri 保存为字符串。您需要将其分解为对象。对于ioredis,您可以使用函数

export function decomposeRedisUrl(url) 
  const [[, , password, host, port]] = [...(url.matchAll(/redis:\/\/(([^@]*)@)?(.*?):(\d*)/g))];
  return  password, host, port ;

这个功能有测试:

it("redis url should be decomposed correctly with password", () => 
  expect(decomposeRedisUrl("redis://pass@host.com:9183")).to.eql(
    password: "pass",
    host: "host.com",
    port: "9183",
  );
);

it("redis url should be decomposed correctly without password", () => 
  expect(decomposeRedisUrl("redis://localhost:6379")).to.eql(
    password: undefined,
    host: "localhost",
    port: "6379",
  );
);

和用法

import Redis from "ioredis";

async function getKeysFromRedisUrl(url) 
  const rc = new Redis(decomposeRedisUrl(url));
  const keys = await rc.keys("*");
  rc.disconnect();
  return keys;


describe("Redis can connect", () => 
  it("with cloud", async () => 
    expect(await getKeysFromRedisUrl("redis://pass@host.com:9183")).to.be.an("array");
  );
  it("with local redis instance", async () => 
    expect(await getKeysFromRedisUrl("redis://localhost:6379")).to.be.an("array");
  );
);
此函数未处理用户名

【讨论】:

以上是关于Node-Redis:就绪检查失败 - 需要 NOAUTH 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

jenkins发送邮件失败“No emails were triggered”

使用 node-redis 获取多个密钥

使用 node-redis 删除 redis 中的键数组

将 node-redis 与 node 8 util.promisify 一起使用

是否在就绪探测失败后重试 Pod

在 node.js 中检查存储桶是不是准备就绪的最佳方法