启用Apollo Engine后GraphIql带参刷新报Content-Type错误
解决Apollo Engine启用后GraphiQL带参数刷新报错的问题
这个问题的核心原因出在Apollo Engine的graphqlPaths配置上——你把/graphql(GraphiQL页面的展示端点)和/client(实际处理GraphQL查询的API端点)都加入了Engine的监控路径,但/graphql本身并不是用来处理查询请求的API端点,它的作用只是渲染GraphiQL界面。
当你在浏览器中携带查询参数刷新GraphiQL页面时,浏览器会发送一个GET请求到/graphql,Apollo Engine看到这个路径在graphqlPaths列表里,就会把它当成GraphQL API请求来处理。但这个页面刷新请求的Content-Type是text/html,不符合GraphQL API期望的application/json格式,所以直接抛出了"Unsupported Content-Type"的错误,而且这个拦截发生在你的自定义代码之前,导致你的鉴权逻辑根本没被触发。
解决方案
修改Apollo Engine的初始化代码,只把实际处理GraphQL查询的端点/client加入graphqlPaths:
engine.listen({ port: port, expressApp: fidserver.app, graphqlPaths: ['/client'] // 仅保留API端点,移除/graphql });
额外验证点
- 确认GraphiQL的
endpointURL依然正确指向/client,你的原有代码这部分是没问题的:
app.use('/graphql', graphiqlExpress({ endpointURL: '/client' }));
- 确保Engine的中间件挂载顺序正确——它应该在你的所有Express路由(包括GraphiQL和
/client端点)之后初始化,这样Engine才能正确代理和监控API请求,同时不会干扰GraphiQL的页面渲染流程。
调整后,刷新带参数的GraphiQL页面时,请求会正常到达GraphiQL路由并渲染页面,Engine只会监控/client路径的API请求,就不会再出现Content-Type不匹配的错误了。
内容的提问来源于stack exchange,提问作者bruce
相关产品推荐
相关产品推荐

