GraphQL多阶段查询:如何在单次请求中复用前置查询结果?
如何在单次GraphQL请求中复用其他查询的结果?
首先明确:GraphQL本身不支持在客户端查询语句里直接用一个字段的返回值作为同请求里其他字段的参数——因为查询里的字段是并行执行的,不存在依赖顺序。但有两种符合规范的实现方式:
方法一:后端Resolver层面处理(推荐)
如果你的GraphQL服务是自己可控的,完全可以在address和contact的resolver逻辑里直接获取info查询返回的token,不需要客户端手动传参。客户端只需要把三个查询合并到同一个请求里:
query($request: TokenRequest!, $query: InfoQuery!) { info(request: $request) { token } address(query: $query) { response } contact { email } }
后端这边,比如用Apollo Server的话,可以通过请求上下文(Context)共享info返回的token,或者在resolver中获取兄弟字段的执行结果,让address和contact自动使用这个token,不需要客户端显式传递。
方法二:使用@defer指令分阶段请求
如果必须在客户端拿到token后再触发address和contact的查询,可以用@defer指令让服务器分两次返回结果:先返回info的token,客户端拿到后自动发起后续字段的请求,整体是一个逻辑上的单次请求。
示例查询:
query($request: TokenRequest!, $query: InfoQuery!) { info(request: $request) { token } ... @defer { address(query: $query, token: $infoToken) { response } contact(token: $infoToken) { email } } }
注意:这个方法需要服务器支持@defer(比如Apollo Server、GraphQL Yoga),而且客户端库(如Apollo Client)要能自动处理分阶段响应,把第一阶段拿到的token填充到后续请求的变量中。
如果以上两种方式都无法实现(比如服务器不可修改、不支持@defer),那只能分两次请求:先调用info拿到token,再带着token调用address和contact——这是当前GraphQL语法限制下的无奈之举。
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

