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

使用graphql-http构建Express应用时Resolver中Session不可用问题

问题分析与解决

错误Cannot set properties of undefined (setting 'captcha')说明context.req.session是undefined,核心原因是graphql-http的context配置错误,导致resolver无法获取到正确的session对象。

解决步骤

1. 修正graphql-http的Context配置

graphql-http的createHandler中,context函数接收的参数是一个包含req、res的对象,而非直接传入req。你之前的写法会导致context.req并非Express的请求对象,自然取不到session。

修改后的路由配置:

app.all(
    "/graphql",
    createHandler({
        schema: schema,
        rootValue: root,
        // 正确获取req对象
        context: ({ req }) => ({ req })
    })
)

2. 确认session中间件的依赖与顺序

  • 确保已安装express-session依赖:
    npm install express-session
    
  • 确保session中间件挂载在所有路由(包括/graphql)之前,你的代码已经满足这一点,但需注意不要将其放在路由之后。

3. 验证resolver中的session访问

修正后,resolver里的context.req.session就能正常获取到session对象,验证码文本可以正确存入:

captcha: (args, context) => {
    const captcha = svgCaptcha.create();
    // 现在session已存在,可以正常赋值
    context.req.session.captcha = captcha.text;
    return captcha.data;
}

完整修正后的代码示例

const express = require('express');
const session = require('express-session');
const { buildSchema } = require('graphql');
const { createHandler } = require('graphql-http/lib/use/express');
const svgCaptcha = require('svg-captcha');

const app = express();

// 先挂载session中间件,顺序不能错
app.use(session({
    secret: 'your-secret-key', 
    resave: false,              
    saveUninitialized: true,    
    cookie: { secure: false }  
}));

let schema = buildSchema(/* GraphQL */`
  type Query {
    captcha: String
  }
`);

let root = {
    captcha: (args, context) => {
        const captcha = svgCaptcha.create();
        context.req.session.captcha = captcha.text;
        return captcha.data;
    }
}

app.all(
    "/graphql",
    createHandler({
        schema: schema,
        rootValue: root,
        context: ({ req }) => ({ req })
    })
);

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:42:43