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

TypeScript GraphQL Redis项目设置session.userId触发类型错误求助

问题排查与解决

1. 核心类型定义错误(最关键)

你的types.ts里把session的类型错误定义成了Express.SessionStore——这是会话存储的类型,并非请求上的会话对象类型。正确的类型应该是Express.Session,同时要结合你扩展的SessionData:

修改types.ts:

import { EntityManager, IDatabaseDriver, Connection } from "@mikro-orm/core"
import { Request, Response } from "express"
import { Session } from "express-session"

// 保留你之前扩展的SessionData
declare module "express-session" {
  interface SessionData {
    userId: number | string | undefined;
  }
}

export type MyContext = {
  em: EntityManager<any> & EntityManager<IDatabaseDriver<Connection>>
  req: Request & { session: Session & Partial<SessionData> };
  res: Response;
}

2. 修复user.id的序列化问题

Redis无法直接序列化BigInt类型,如果你的MikroORM实体User的id是BigInt类型,赋值给req.session.userId时会触发类型错误。解决方法二选一:

  • 转为数字存储:
    req.session.userId = Number(user.id);
    
  • 转为字符串存储:
    req.session.userId = user.id.toString();
    

3. Redis客户端初始化优化

避免用as any强制类型转换,正确初始化本地Redis客户端:

// main.ts里的Redis客户端初始化部分
const redisClient = redis.createClient({
  url: "redis://localhost:6379"
});
await redisClient.connect();

确保connect-redis版本与@redis/client版本兼容(推荐connect-redis@7.x搭配@redis/client@4.x)。


内容的提问来源于stack exchange,提问作者Vikash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:24:10