Apollo Server集成Express时server.applyMiddleware({ app })的含义是什么?
server.applyMiddleware({ app }) 逻辑说明 核心本质
server.applyMiddleware({ app }) 是Apollo Server封装的中间件挂载语法糖,本质是帮你省略手动获取Apollo中间件、手动挂载到Express实例的重复步骤,本身没有额外的特殊逻辑。
具体执行逻辑
这个方法内部会自动完成两个操作:
- 调用内部的
server.getMiddleware()方法,拿到Apollo运行必需的所有Express中间件集合,包含:- GraphQL POST/GET请求的参数解析逻辑
- GraphQL查询、Mutation的执行处理逻辑
- 默认Apollo Sandbox(GraphQL调试页面)的静态资源路由
- 跨域、请求上下文初始化等配套逻辑
- 自动调用你传入的Express实例
app的use方法,把上述所有中间件挂载到指定路径(默认是/graphql)
和你熟悉的app.use写法的对应关系
你理解的app.use(server.getMiddleware(rest))写法和applyMiddleware完全等价,后者只是把两步操作封装成了一个API调用,下面两段代码效果完全一致:
// 封装写法 server.applyMiddleware({ app }); // 等效的手动写法 const apolloMiddlewares = server.getMiddleware(); app.use('/graphql', apolloMiddlewares);
你也可以通过参数自定义挂载配置,比如修改访问路径、关闭自动跨域配置:
server.applyMiddleware({ app, path: '/api/graphql', // 自定义GraphQL服务访问路径 cors: false // 禁用Apollo自动配置的跨域规则,使用你自己的Express跨域配置 })
封装的意义
这套API设计是为了兼容不同的Node服务框架,比如Koa、Fastify、Hapi等都有对应的applyMiddleware实现,开发者不需要关心不同框架中间件挂载的语法差异,统一调用该方法传入对应框架的应用实例即可完成Apollo的挂载。
内容的提问来源于stack exchange,提问作者codeCore Team
相关产品推荐
相关产品推荐

