.Net Core 3.1存入Redis的数据,Node.js读取报WRONGTYPE错误求解决
Node.js读取.Net Core存入Redis的缓存报WRONGTYPE错误的解决思路
问题原因
WRONGTYPE错误本质是你用String类型的读取命令(GET)去操作Redis中实际为Hash类型的key。
你使用的.Net Core侧Microsoft.Extensions.Caching.StackExchangeRedis包,默认不会将缓存数据直接以String类型存入Redis,而是采用Hash结构存储(内部会把缓存数据、过期时间等元信息封装在Hash中),而Node.js侧用redisClient.get()是专门读取String类型key的命令,类型不匹配就会触发该错误。
解决步骤
1. 验证Redis中key的类型
先通过Redis CLI确认目标key的类型:
TYPE <你的完整缓存键>
比如你的Env是dev,cacheKey是user_data,就执行TYPE dev_user_data,返回结果应该是hash,验证类型不匹配的问题。
2. Node.js侧改用Hash类型的读取命令
redis@4.x客户端提供了Hash相关的读取方法,对应调整代码:
方法1:用HGETALL读取完整Hash数据并解析
exports.getRedisData = async (key) => { try { const hashData = await redisClient.HGETALL(key); // 该包存入的Hash中,核心数据通常存在`value`字段 if (!hashData?.value) return null; // 转换为UTF8字符串并解析JSON const jsonStr = Buffer.isBuffer(hashData.value) ? hashData.value.toString('utf8') : hashData.value; return JSON.parse(jsonStr); } catch (error) { console.log(error); return null; } }
方法2:先确认Hash的字段名
如果执行上述代码发现没有value字段,先通过Redis CLI查看该Hash的所有字段:
HKEYS <你的完整缓存键>
拿到字段名后,改用HGET指定字段读取:
// 假设字段名是"data" exports.getRedisData = async (key) => { try { const rawData = await redisClient.HGET(key, 'data'); if (!rawData) return null; const jsonStr = Buffer.isBuffer(rawData) ? rawData.toString('utf8') : rawData; return JSON.parse(jsonStr); } catch (error) { console.log(error); return null; } }
补充说明
Microsoft.Extensions.Caching.StackExchangeRedis包的缓存实现是为了适配.NET缓存系统的特性(比如滑动过期、缓存条目元信息管理),所以才会用Hash结构存储,而非简单的String类型。只要对应使用Hash类型的操作命令,就能正常读取到数据。
内容的提问来源于stack exchange,提问作者Ashan Maduranga
相关产品推荐
相关产品推荐

