使用TypeScript时Redis OM fetchRepository报错问题求助
Redis OM + TypeScript 购物车开发错误解决
错误原因
你遇到的Property 'fetchRepository' does not exist on type 'typeof App'错误,本质是Redis OM客户端实例创建错误+导入导出不匹配导致的:
- 原
app.ts中把connect()返回的Promise直接传给Client.use(),这是错误的,use()需要接收的是Redis客户端实例,而非Promise。 - 导出方式与导入方式不匹配,原代码用
module.exports.client导出命名变量,但Schema文件用默认导入import client from '../../../../app',导致TypeScript无法识别正确的客户端类型。 - 滥用
any类型掩盖了早期的类型错误,问题爆发时无法准确提示根源。
分步修正
1. 重构app.ts的Redis客户端创建与导出
修正后的app.ts需要正确创建Redis客户端、完成连接,再生成Redis OM的Client实例并导出:
// app.ts import { createClient } from 'redis' import { Client } from 'redis-om' // 处理Redis连接地址 const redisUrl: string = process.env.REDIS_URL || 'redis://localhost:6379' const redisClient = createClient({ url: redisUrl }) // 监听连接错误 redisClient.on('error', (err) => console.error('Redis连接异常:', err)) // 异步完成连接 (async () => { await redisClient.connect() console.log('数据库连接成功') })() // 创建并导出Redis OM Client实例 export const client = new Client().use(redisClient)
2. 修正Schema文件的导入与Repository初始化
调整Schema文件的导入方式,并正确处理索引创建的异步逻辑:
import { Entity, Schema } from 'redis-om' // 改为命名导入,匹配app.ts的导出 import { client } from '../../../../app' export default class Cart extends Entity {} const CartSchema = new Schema(Cart, { item_name: { type: 'string' }, item_Cost: { type: 'number' }, coin_type: { type: 'string' } }) // 现在client是有效的Redis OM Client,可正常调用fetchRepository export const CartRepository = client.fetchRepository(CartSchema) // 用异步函数处理索引创建,避免未完成连接就执行操作 (async () => { await CartRepository.createIndex() })()
额外注意事项
- 避免滥用
any类型:TypeScript的类型检查能帮你提前发现错误,尽量给变量指定明确类型,比如为redisUrl指定string类型。 - 拆分逻辑模块:建议把Redis连接逻辑放到单独的模块(比如
redis-client.ts),避免入口文件的异步逻辑混乱,也方便其他模块复用。
内容的提问来源于stack exchange,提问作者user23424
相关产品推荐
相关产品推荐

