Node.js+Express+Redis调用SET/GET时出现属性读取未定义错误
解决Redis client调用get/set时出现的TypeError问题
问题根源
你遇到的TypeError: Cannot read properties of undefined (reading 'get')本质是导入的client变量为undefined,大概率是循环依赖或者导入路径错误导致的:
- 循环依赖:如果
server.ts中导入了控制器模块,而控制器又反过来导入server.ts的client,会导致模块加载时client还未完成初始化,变成undefined。 - 导入路径错误:相对路径写错,导致导入的不是正确的
client实例。
解决方案
1. 拆分Redis连接到独立文件(解决循环依赖)
把Redis连接逻辑从server.ts中抽离出来,单独放在一个文件里,避免模块间的循环引用:
创建redis.client.ts文件(比如放在src/config目录下):
import { createClient } from 'redis'; export const client = createClient({ url: "redis://127.0.0.1:6379", }); // 处理连接和错误 client.connect().catch(err => console.error('Redis连接失败:', err)); client.on("error", (err) => console.log("Redis Client Error", err));
然后在server.ts中导入这个client:
import { client } from './config/redis.client'; // 其余Express配置代码不变
控制器中也从这个独立文件导入client:
import { client } from '../config/redis.client'; const allProjects = async (req: Request, res: Response): Promise<void> => { const cachedProjects = await client.get("projects"); if (cachedProjects) { res.status(200).json(JSON.parse(cachedProjects)); return; // 避免后续重复返回响应 } const projects = await Projects.find({}); if (!projects.length) { // Mongoose的find方法返回空数组而非null,需判断长度 res.status(400).send("No projects found"); throw new Error("No projects found"); } await client.set("projects", JSON.stringify(projects), { EX: 3600 // 可选:设置1小时过期时间,避免缓存数据过时 }); res.status(200).json(projects); };
2. 验证导入路径正确性
检查控制器中导入client的相对路径是否匹配文件实际位置:
- 若控制器在
src/controllers/project.ts,Redis配置文件在src/config/redis.client.ts,路径应为../config/redis.client - 可在控制器中打印
client验证:console.log(client),若输出undefined,说明路径错误
3. 额外优化点
- 使用缓存后必须加
return,防止代码继续执行后重复发送HTTP响应 - 给缓存设置过期时间,避免长期使用过时数据
- 修正Mongoose查询结果的判断逻辑,
find({})返回空数组而非null
内容的提问来源于stack exchange,提问作者noob_developer
相关产品推荐
相关产品推荐

