Node.js使用Redis RPush添加元素报WRONGTYPE错误如何解决
错误原因
你遇到的WRONGTYPE报错是因为Redis中已经存在名为veggies的键,且该键对应的值类型不是列表(list),而RPUSH命令只能作用于列表类型的键,所以触发类型不匹配错误。
解决步骤
- 第一步:确认现有键的类型
直接在Redis命令行执行TYPE veggies,返回结果如果不是list就说明类型冲突,返回string/hash/set等都属于不符合要求的类型。 - 第二步:处理冲突的旧键
如果旧键存储的数据没有业务价值,直接执行DEL veggies删除现有错误类型的键,之后再运行你的代码,Redis会自动创建列表类型的veggies键,RPUSH就能正常执行。注意:如果旧键存储的业务数据需要保留,建议先把旧数据迁移到其他键名,再删除原键,避免数据丢失。
- 第三步:(可选)代码增加类型校验,避免后续重复报错
可以在执行RPUSH逻辑前先校验键的类型,优化后的代码参考如下:
const redis = require('redis'); const redisClient = redis.createClient(); // 补充连接错误监听,排查连接异常问题 redisClient.on('error', err => console.log('Redis Client Error', err)); var arr = ["some val","some val2","some val3"]; // 先校验键类型 redisClient.type('veggies', (err, type) => { if (err) throw err; // 如果类型存在且不是list,提前拦截处理 if (type && type !== 'list') { console.log('veggies键类型错误,当前类型为:', type); // 业务侧可根据需求选择删除旧键或者走其他分支逻辑 return; } var multi = redisClient.multi(); for (var i=0; i<arr.length; i++) { multi.rpush('veggies', arr[i]); } multi.exec(function(err, response) { if(err) throw err; console.log("response : ", response); }) })
额外提示:如果使用的是
redis@4.x及以上版本的npm包,默认是Promise风格API,不支持回调写法,需要在创建客户端时开启legacy模式才能兼容旧写法,创建客户端代码调整为:const redisClient = redis.createClient({ legacyMode: true }); // v4版本需要主动调用connect方法建立连接 redisClient.connect().catch(console.error);
内容的提问来源于stack exchange,提问作者user2285831
相关产品推荐
相关产品推荐

