如何在Apollo Server中实现服务端重定向?
在Apollo Server中实现服务端重定向的方案
1. 能否通过解析器上下文获取Express的res对象?
可以。只要在配置Apollo Server的expressMiddleware时,将Express的req和res对象注入到解析器的上下文中即可。
示例配置代码:
const { ApolloServer } = require('@apollo/server'); const { expressMiddleware } = require('@apollo/server/express4'); const express = require('express'); const app = express(); const typeDefs = /* 你的GraphQL类型定义 */; const resolvers = /* 你的解析器 */; const server = new ApolloServer({ typeDefs, resolvers }); await server.start(); app.use( '/graphql', express.json(), expressMiddleware(server, { context: async ({ req, res }) => ({ req, res }), // 注入req和res到上下文 }), ); app.listen(4000);
2. 如何借助Apollo Server实现服务端重定向?
在解析器中直接使用上下文中的res.redirect()方法即可,但要注意场景局限性:
解析器示例
const resolvers = { Mutation: { initiateRedirect: async (_, { targetUrl }, { res }) => { // 发送临时重定向(302)到目标URL res.redirect(302, targetUrl); // 由于重定向已发送,返回null或空对象即可(客户端可能无法接收此返回值) return null; }, }, Query: { redirectOnQuery: async (_, args, { res }) => { res.redirect(301, 'https://example.com'); // 永久重定向 return null; }, }, };
关键注意事项
- 适用场景限制:这种方式仅适用于直接向GraphQL端点发送HTTP请求的场景(如浏览器直接访问、curl命令调用)。如果使用Apollo Client等GraphQL客户端,它们会期望JSON响应,重定向会被忽略甚至触发错误。
- 避免重复响应:调用
res.redirect()后,不要再返回其他数据,否则会导致"Cannot set headers after they are sent to the client"错误。 - 选择合适的状态码:根据业务需求选择301(永久重定向)或302(临时重定向),也可以使用307/308保持请求方法不变。
内容的提问来源于stack exchange,提问作者George Eracleous
相关产品推荐
相关产品推荐

