You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:30:21