Node.js使用redis@3.1.2连接Heroku Redis时报'auth'命令参数错误
问题解决:Node.js redis@3.1.2 连接Heroku Redis报auth参数数量错误
错误原因
redis@3.1.2版本解析redis://h:<password>@<host>:<port>格式的Heroku Redis连接URL时,会自动将URL中的h识别为ACL用户名,向服务端发送AUTH h <password>双参数命令。但Heroku托管的Redis实例默认未启用ACL功能,仅支持单参数格式AUTH <password>,因此触发ERR wrong number of arguments for 'auth' command错误。
可行解决方案
方案1:预处理URL移除虚拟用户名
不需要修改Heroku侧配置,仅在代码内处理连接URL即可:
const redis = require('redis'); // 移除URL中的虚拟用户名前缀 h: const REDIS_URL = process.env.REDIS_URL.replace('redis://h:', 'redis://'); const client = redis.createClient(REDIS_URL, { // Heroku Redis默认需要TLS连接,添加以下配置避免连接失败 tls: { rejectUnauthorized: false } });
方案2:手动指定密码覆盖URL解析结果
提取URL中的密码单独传入配置项,优先级高于URL自动解析的参数:
const redis = require('redis'); const REDIS_URL = process.env.REDIS_URL; // 提取URL中的密码 const redisPassword = REDIS_URL.split('@')[0].split(':')[2]; const client = redis.createClient(REDIS_URL, { auth_pass: redisPassword, tls: { rejectUnauthorized: false } });
方案3:升级redis依赖到4.x兼容版本
redis@4.x及以上版本对Heroku这类带虚拟用户名的连接URL做了兼容处理,直接传入原始URL即可正常连接:
- 升级依赖包
npm install redis@^4 - 连接代码示例
const { createClient } = require('redis'); const client = createClient({ url: process.env.REDIS_URL, socket: { tls: true, rejectUnauthorized: false } }); // 4.x版本需要手动触发连接 await client.connect();
内容的提问来源于stack exchange,提问作者denislexic
相关产品推荐
相关产品推荐

