Typescript 如何为类型由其同级字段确定的GraphQL抽象字段实现解析器? 问题
我正在使用实现一个位于RESTAPI之上的GraphQL服务器 RESTAPI返回一个实体,其根级别字段决定另一个根级别字段的形状。i、 eTypescript 如何为类型由其同级字段确定的GraphQL抽象字段实现解析器? 问题,typescript,graphql,apollo-server,Typescript,Graphql,Apollo Server,我正在使用实现一个位于RESTAPI之上的GraphQL服务器 RESTAPI返回一个实体,其根级别字段决定另一个根级别字段的形状。i、 e { “entityType”:“foo”, “entityMetadata”:{/*基于`entityType`*/}的值, } 在GraphQL模式中,其形状由其同级值决定的字段是抽象类型。我想为那个抽象字段写一个解析器。我想我应该使用,但我在这样做时遇到了困难,因为我传递给抽象字段的\uu resolveType方法的参数没有包含任何引用同级字段值的
{
“entityType”:“foo”,
“entityMetadata”:{/*基于`entityType`*/}的值,
}
在GraphQL模式中,其形状由其同级值决定的字段是抽象类型。我想为那个抽象字段写一个解析器。我想我应该使用,但我在这样做时遇到了困难,因为我传递给抽象字段的\uu resolveType
方法的参数没有包含任何引用同级字段值的方法
那我该怎么办
另一个例子
我将使用以下GraphQL模式来说明我的问题
type Character {
job: String!
weapon: Weapon
}
interface Weapon {
yearMade: Number
}
type LightSaber implements Weapon {
yearMade: Number
color: String
}
type Blaster implements Weapon {
yearMade: Number
ammo: Number
}
type Query {
searchCharacters: [Character]
}
在这个模式中,我有一个字符
类型,带有作业
和武器
字段。角色的工作决定了他们将使用的武器类型
因此,如果角色的任务是“绝地”
的话,他们的武器应该是光剑类型的,并且有一个唯一的颜色区域。如果角色的任务是“暴风雨衣”
他们的武器将是爆炸机类型,并带有一个专用弹药场
interface BaseCharacter {
job: String
weapon: Weapon
}
type Jedi implements BaseCharacter {
job: String
weapon: LightSaber
}
type Stormtrooper implements BaseCharacter {
job: String
weapon: Blaster
}
union Character = Jedi | Stormtrooper
type Query {
searchCharacters: [Character]
}
我想通过searchCharacters
查询搜索所有可用字符,并根据武器类型返回其字符数据和武器的专用数据
query {
searchCharacters {
type
weapon {
yearMade
... on LightSaber {
color
}
... on Blaster {
ammo
}
}
}
}
这适用于所有字符数据,但我在尝试解析武器的类型时遇到了一个障碍。到目前为止,我有:
const武器={
__resolveType:async({yearmake},上下文,信息):“光剑”|“爆炸机”=>{
//我如何确定它是光剑还是爆能枪?
},
};
最初,我的印象是\u resolveType()
函数的父字段将是已解析的字符
对象(即{type:'jedi',武器:{yearMade:8,…otherWeaponProperties},…otherProperties}
),但实际上它只是字段的当前对象(即{yearMade:8,…其他武器属性}
)
如果我可以访问字符
的类型
字段,我可以确定武器类型,但我不能
潜在解决方案
我看到了解决这个问题的两种方法
解决方案#1
第一种解决方案是将字符的作业
值附加到武器
对象(即{job:'jedi',yearmake:8,…otherWeaponProperties}
),这样武器
字段的\u resolveType
函数就可以在其第一个参数中访问作业值
const解析器={
查询:{
searchCharacters:async()=>{
返回api.getCharacters().map(apiCharacterData=>{
返回{
//---重要变革的开始---
…字符数据,
武器:{
…apiCharacterData.arm
作业:apiCharacterData.job,
}
//---重要变革的结束---
};
});
},
},
武器:{
//---第一个参数是对象`{job,…apiCharacterData.wearm}`
__resolveType:({job})=>{
返回任务==‘绝地武士’?‘光剑’:‘爆能枪’;
}
},
}
解决方案#2
第二个解决方案是更改基础架构,这样就不用一般化的字符
类型,而是有绝地
和冲锋队
类型实现了字符
接口,这些类型明确地详细说明了武器
字段的类型
interface BaseCharacter {
job: String
weapon: Weapon
}
type Jedi implements BaseCharacter {
job: String
weapon: LightSaber
}
type Stormtrooper implements BaseCharacter {
job: String
weapon: Blaster
}
union Character = Jedi | Stormtrooper
type Query {
searchCharacters: [Character]
}
然后我只需要将\u resolveType
添加到字符
联合类型,而不是武器
类型
const字符={
__resolveType:({job})=>{
返回任务==‘绝地武士’?‘光剑’:‘爆能枪’;
},
};
救命啊!
在这两种可能的解决方案之间,解决方案#2似乎是朝着正确方向迈出的一步。解决方案#2比解决方案#1的最大好处是,我没有映射api数据,我让解析程序执行每个实体的解析程序需要执行的操作
但是查询的嵌套性质以及包含的…on BaseCharacter
内联片段让我觉得我误解了如何正确地编写一个GraphQL模式来模拟我试图实现的目标
我很确定这不是一个罕见的问题,但我很难找到解决方法。非常感谢大家的帮助