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

KeystoneJS 6中graphQLSchemaExtension自定义mutation无session问题求助

解决KeystoneJS 6自定义mutation无法获取有效session的问题

以下是针对该问题的排查和解决步骤:

  • 确认自定义resolver中正确获取session
    在自定义mutation的resolver里,必须明确从传入的context参数中提取session,不能依赖默认的自动注入逻辑。示例代码如下:

    const customSchemaExtension = {
      type: `
        type Mutation {
          customOperation(input: CustomInput!): CustomOutput
        }
      `,
      resolvers: {
        Mutation: {
          customOperation: async (_, args, context) => {
            // 直接从context中获取session
            const session = context.session;
            if (!session) {
              throw new Error('未授权,请先登录');
            }
            // 后续业务逻辑
            return { /* 返回结果 */ };
          },
        },
      },
    };
    
  • 检查Keystone配置的顺序
    确保session配置项在graphQLSchemaExtension之前声明,保证session中间件先于自定义schema加载生效。示例配置结构:

    export default config({
      // 先配置session
      session: {
        secret: process.env.SESSION_SECRET!,
        secure: process.env.NODE_ENV === 'production',
        sameSite: 'lax',
        // 若有自定义序列化/反序列化逻辑,确保逻辑正确
        serialize: (session) => JSON.stringify(session),
        deserialize: (str) => JSON.parse(str),
      },
      // 再配置schema扩展
      graphQLSchemaExtension: (baseSchema) => ({
        ...baseSchema,
        ...customSchemaExtension,
      }),
      // 其他配置项
      lists: { /* 你的列表定义 */ },
    });
    
  • 验证前端请求的头信息传递
    前端调用自定义mutation时,要确保和普通mutation请求一样携带session凭证:

    • 若使用Cookie-based session,请求时需设置credentials: 'include'(浏览器端)或withCredentials: true(Axios等库);
    • 若使用Token-based session,需在请求头中携带Authorization: Bearer <token>。
  • 排查版本兼容性问题
    部分早期KeystoneJS 6版本存在schema扩展中session传递的bug,建议升级到最新稳定版:

    npm update @keystone-6/core
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:45:38