Strapi(Koa)会话无法正常使用,求助排查问题
问题分析与解决
核心问题1:错误的Session赋值方式
你直接通过context.session = context.state.user替换整个session对象的方式是错误的。Strapi的session是特殊实例,需通过修改属性或set方法存储数据,而非直接覆盖对象。
正确写法二选一:
// 方式1:直接设置属性 context.session.user = context.state.user; // 方式2:使用set方法 context.session.set('user', context.state.user);
核心问题2:未启用CookieParser中间件
你的config/middleware.ts中注释了cookieParser配置,但Strapi的session中间件依赖它解析Cookie中的会话标识,必须启用:
export default ({ env }) => ({ settings: { session: { enabled: true, client: 'cookie', key: 'strapi.sid', prefix: 'strapi:sess:', secretKeys: env.array('APP_KEYS'), httpOnly: true, maxAge: 24 * 60 * 60 * 1000, // 24 hours overwrite: true, signed: false, rolling: false }, cookieParser: { enabled: true } } })
额外检查点
- 确认
APP_KEYS环境变量已正确配置,Strapi依赖它签名、验证会话数据。 - 若使用GraphQL(从resolver结构判断大概率是),需保证
session中间件在graphql之前执行。可在config/middleware.ts的list数组中调整顺序,确保会话能在resolver中被正确访问修改。
修改后的Resolver示例:
import { Strapi } from '@strapi/strapi' export default ({ strapi }: { strapi: Strapi }) => ({ search: { resolve: async (obj, { name }, context) => { console.log(context.session, context.state.user) // 正确设置session数据 context.session.user = context.state.user; return await strapi.service('api::printful.product').search({ name }) } } })
修改完成后重启Strapi服务,再测试请求,会话数据即可在后续请求中正常读取。
内容的提问来源于stack exchange,提问作者qraxiss
相关产品推荐
相关产品推荐

