Redis:ERR 'auth' 命令的参数数量错误

8

我正在使用redis和nodejs进行开发。版本:"redis": "^3.1.2"

当我的服务器连接到redis时,我会收到以下错误:

ERR wrong number of arguments for 'auth' command

我猜这与URL有关,它看起来像这样:
redis://h:<password>@<url>:<port>

我的 Redis 托管在 Heroku 上,我无法更改 URL。而且我不知道如何使它工作。有任何想法或解决方案将不胜感激。


3
Redis 3.1.2有重大变化。以上的URL适用于redis@^3.0.2。 - Ritesh Kumar Gupta
4
这是来自Heroku的发布说明:https://devcenter.heroku.com/changelog-items/1932。请从Heroku环境变量中的URL字符串中删除用户名。它应该看起来像redis:// password_goes_here @ host_goes_here:port_goes_here。 - Ritesh Kumar Gupta
1个回答

23
Redis版本 < 6.0.0 和 node-redis >=3.1.0 ,redis://h:<password>@<url>:<port> 将不起作用,并抛出 ERR wrong number of arguments for 'auth' command 错误。
解决方法: redis://:<password>@<url>:<port> 可以使用,即:从 URL 中删除用户名。 注意:在 <password> 前面加上 ":"。
这应该可以解决你面临的问题。
对于其他版本:
Redis版本 < 6.0.0 和 node-redis <=3.0.2 ,redis://h:<password>@<url>:<port> 可以使用。
Redis版本 >= 6.0.0 和 node-redis(任何版本),redis://<username>:<password>@<url>:<port>(当 Redis ACL 中的用户名设置为自定义用户名时)和 redis://<password>@<url>:<port> 都可以使用。
原因是:
node-redis 进行了更改以支持 Redis-6,根据 releasenote
Redis-6 支持 ACL 中的用户名。在 v6 之前,Redis 不包括用户的概念,唯一的身份验证策略是单个登录密码。Reference 每当将 Redis 插件附加到 Heroku 容器时,环境变量 REDIS_URL 就会设置,并且值是格式为 redis://h:<password>@<url>:<port> 的连接 URL。这个 "h" 是一个虚假/占位符用户名,因为一些客户端(例如:node-redis)无法正确处理 URL 中的空用户名。在 Redis 6 中发布 ACL 后,客户端开始支持使用 2 个参数(用户名和密码)的新 AUTH 命令。尝试将 h 用户名传递给 AUTH 的客户端将在 Redis 版本 4 和 5 上导致上述错误。Reference

1
谢谢。对于其他可能看到这条信息的人,我使用了一个简单的正则表达式来从Heroku提供的URL中去除“h”。 - denislexic
2
我们遇到了这个问题,是因为promise-redis(目前不建议使用)在依赖解析中包含了node-redis*版本。我们现在正在运行Redis 5.0,所以在一个完全无关的更改中从3.0更新到3.1破坏了带有用户名的AUTH命令。感谢您提供的精彩解释! - Matt Forster
7
只是一个评论,解决方案:redis://<password>@<url>:<port> 可以使用,即从URL中删除用户名。应该是:解决方案:redis://:<password>@<url>:<port> 可以使用,即从URL中删除用户名。您需要在密码之前加上 : - shernshiou
2
@shernshiou 你是对的,这个:redis://:<password>@<url>:<port> 对我很有效。 - OBI PASCAL BANJUARE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接