使用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
相关产品推荐
相关产品推荐

