Apollo Server 3 Express中间件与React SSR路由冲突问题咨询
问题成因
这个现象是apollo-server-express 3.x版本两处逻辑调整共同导致的,你没在更新日志里找到对应说明,是因为其中一处属于内部请求判定逻辑调整,没有放在显眼的迁移提示条目里:
- 第一处是3.0版本明确标注的破坏性变更:3.x不再自动内置
body-parser请求体解析能力。2.x版本会自动在配置的GraphQL端点路径上挂载JSON请求体解析中间件,所有发往/graphql的POST请求都会被提前解析好请求体,Apollo Server可以直接读取到请求里携带的GraphQL查询、变量等内容,判定为合法请求后直接处理,不会向后流转给其他中间件;3.x要求开发者手动在Express实例上挂载express.json()中间件完成请求体解析,如果你升级后没加这步配置,Apollo Server拿不到POST请求的body内容,会直接判定当前请求不属于自己的处理范围,调用next()把请求放行给后续挂载的中间件。 - 第二处是未重点公示的逻辑改动:2.x版本只要请求路径命中配置的
/graphql,不管请求格式、方法是否合法,Apollo Server都会直接接管请求返回对应响应(比如405方法不允许、400请求格式错误等状态码),绝对不会放行给后续中间件;3.x调整了请求匹配规则,哪怕路径完全匹配/graphql,只要请求不满足「携带合法GraphQL查询参数、符合端点支持的请求方法/Content-Type要求」,就会直接放行给后续中间件处理。
你在SSR中间件里加的路径判断,本质是绕开了Apollo Server的合法性校验环节,强制把所有/graphql路径的请求从SSR中间件放行到后续的处理链路中,所以功能可以恢复正常。
如果想去掉这段硬编码的判断,只需要做几个简单调整就能恢复和2.x一致的流转逻辑:
- 在注册Apollo Server中间件前,先给Express实例挂载
express.json()中间件,完成JSON请求体解析 - 检查Apollo Server配置,确保开启了你需要的端点能力(比如开发环境的Sandbox/Playground、GET查询支持等),让合法请求能被正常识别
- 调整中间件注册顺序,把Apollo Server的中间件放在SSR中间件之前注册,减少不必要的请求流转
内容的提问来源于stack exchange,提问作者F.P
相关产品推荐
相关产品推荐

