Apollo Server 4中如何传递上下文值?适配3.x旧写法的疑问
在Apollo Server 4中实现会话刷新与上下文传递的方案
Apollo Server 4的上下文配置逻辑与v3本质一致,仅服务器初始化API有所调整,以下是两种常见场景的实现方式,可完全复用你原有的会话处理逻辑:
1. Standalone模式(快速启动)
这是AS4推荐的默认启动方式,上下文通过startStandaloneServer的context选项配置:
import { startStandaloneServer } from '@apollo/server/standalone'; import { executableSchema } from './your-schema-path'; import { contextFunction } from './your-context-path'; import { secretValues } from './your-secrets-path'; async function startServer() { const { url } = await startStandaloneServer(executableSchema, { debug: true, // 直接传入原有的上下文函数 context: contextFunction(secretValues), listen: { port: 4000 }, }); console.log(`🚀 Server ready at ${url}`); } startServer();
2. 集成到Express框架
若需与Express集成,通过expressMiddleware的context选项配置上下文:
import { ApolloServer } from '@apollo/server'; import { expressMiddleware } from '@apollo/server/express4'; import express from 'express'; import { executableSchema } from './your-schema-path'; import { contextFunction } from './your-context-path'; import { secretValues } from './your-secrets-path'; async function startServer() { const app = express(); const server = new ApolloServer({ debug: true, schema: executableSchema, }); await server.start(); app.use( '/graphql', express.json(), // 传入上下文函数 expressMiddleware(server, { context: contextFunction(secretValues), }), ); await new Promise<void>((resolve) => app.listen({ port: 4000 }, resolve)); console.log(`🚀 Server ready at http://localhost:4000/graphql`); } startServer();
核心说明
- 你原有的
contextFunction无需任何修改,闭包传递secretValues、会话验证刷新、返回的上下文数据(pubsub、dataLoaders、session等)逻辑完全兼容AS4。 - 每个请求会独立生成上下文,所有解析器都能直接获取到最新的会话状态,无需在解析器中单独处理会话刷新。
内容的提问来源于stack exchange,提问作者Gergő Horváth
相关产品推荐
相关产品推荐

