graphql 计算指令之 @skipBy 和 @includeBy:使用表达式实现简单控制流
问题背景
graphql 内置了 @skip 和 @include 来决定是否跳过某个字段的解析获取,其参数为 bool 类型,但是真实的业务场景往往更加复杂。比如我们想让 userId 在 100 以内的用户才可以看到优惠券,或者通过配置化的方式来判断查询使用的版本参数可以获取到哪些字段。
如下查询,期望只有 v2 版本的客户端才可以看到,这个逻辑要不在 email 对应的 DataFetcher 中实现,要不直接获取、返回多余数据。第一种方式都不够灵活,第二种方式当 email 获取成本大时将不可接受、例如有一次网络调用。
解决方案
graphql 提供了指令机制,该机制类似于 java 注解,可用于 graphql 查询执行能力的动态拓展。
定义是去获取某个字段的指令:
predicate:判断是否解析该字段的表达式,表达式参数为查询变量(和其他 @fetchSource:进阶使用,将在以后介绍);
@includeBy 是 graphql 内置指令@include
的扩展版本,可通过表达式判断是否请求该字段,表达式参数为查询变量和其他 @fetchSource。
@fetchSource 为进阶使用,参考grapqhl-calculator README。
使用 @includeBy 查询如下,只有表达式为 true 时,email 对应的 DataFetcher 才会执行。
该能力可通过graphql-java-calculator进行实现,该组件基于指令系统、为 graphql 查询提供数据编排、动态计算和控制流的能力。实现代码参考@includeBy exmaple,框架使用完整示例参考Example。
联系反馈
笔者为graphql-java组件的活跃 contributor、主要参与了 15、16 版本的指令能力升级和语法校验完善,先后在美团、快手从事 graphql 的平台化工作。欢迎使用graphql-java-calculator,期待使用反馈和参与建设。
版权声明: 本文为 InfoQ 作者【coder_xy】的原创文章。
原文链接:【http://xie.infoq.cn/article/13f0da34590dccc9342bc655d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论