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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:25:33