是否可对GraphQL查询的输入参数标记弃用?为何无文档弃用警告
原因分析
- 按照GraphQL稳定版官方规范,
@deprecated指令默认仅支持标记字段定义、枚举值两类节点,输入参数不在默认支持的标记范围内,所以大多数主流GraphQL文档工具、服务端框架会直接忽略参数上的@deprecated标记,不会展示弃用提示。 - 即便最新的GraphQL规范草案已经扩展了
@deprecated的适用范围到输入参数,但目前绝大多数工具(如 GraphiQL 1.x、旧版Apollo Studio)还没有适配这个特性,依旧不会识别参数上的弃用标记。
解决方案
你可以根据业务场景选择以下任意一种方案处理:
- 方案1:兼容过渡后直接移除(最通用)
先在服务端逻辑层做兼容:即便前端传了param2也直接忽略,不影响现有业务运行。等待1~2个版本周期,确认所有调用方都不再传param2后,直接从参数定义里删掉该参数即可。如果需要提前通知调用方,可以在接口变更公告、公共说明文档里单独标注该参数即将下线。 - 方案2:封装输入对象(兼容规范,可展示弃用提示)
如果需要在GraphQL文档里明确展示弃用提示,可以把参数封装为单独的输入对象,将@deprecated标记加在输入对象的字段上,这是符合GraphQL规范的写法,所有文档工具都能正常识别:input GetSomethingInput { param1: String! param2: String @deprecated(reason: "param2 is no longer used") } extend type Query { getSomething(input: GetSomethingInput!): String! } - 方案3:自定义指令扩展(仅适合自研工具链场景)
如果你们的GraphQL服务、文档工具全是自研的,可以自定义支持参数弃用的指令,同时修改文档渲染逻辑,识别输入参数上的弃用标记并展示提示。但该方案属于非标准实现,兼容性极差,对外提供的公开接口不建议使用。
注意:部分小众GraphQL框架可能自定义扩展了
@deprecated的适用范围,可以识别参数上的弃用标记,但这个属于框架专属能力,不要作为通用方案依赖。
内容的提问来源于stack exchange,提问作者Tenusha Guruge
相关产品推荐
相关产品推荐

