【发布时间】:2020-01-02 07:27:04
【问题描述】:
我有一种情况,我想在点击查询的解析器之前有条件地从查询选择中排除一个字段。
用例是我的底层 API 仅根据用户的区域设置公开某些“字段”,如果请求的字段不包含在该区域设置中,对该 API 的调用将引发错误。
我尝试了一种使用指令的方法,
type Person {
id: Int!
name: String!
medicare: String @locale(locales: ["AU"])
}
type query {
person(id: Int!): Person
}
使用SchemaDirectiveVisitor.visitFieldDefinition,当用户语言环境与指令中定义的任何语言环境都不匹配时,我会覆盖medicare 字段的field.resolve 以返回null。
但是,当具有非 "AU" 语言环境的客户端执行以下操作时
query {
person(id: 111) {
name
medicareNumber
}
}
}
永远不会调用 medicare 的字段解析器,并且查询解析器会向底层 API 发出请求,将选择集中的字段(包括无效的 medicareNumber)附加为查询参数。此时 API 调用返回一个错误对象。
我认为这是有道理的,因为指令解析器似乎在 FieldDefinition 上,并且只会在 person 解析器返回有效结果时调用。
有没有办法实现这种功能,有或没有指令?
【问题讨论】:
标签: apollo apollo-server