Graphql 如何创建能够‘;完成’;a型

Graphql 如何创建能够‘;完成’;a型,graphql,Graphql,假设我们有一个变异,它返回一个仅具有属性id的对象数组。要“完成”此类型,我们必须为此对象的每个属性创建一个解析器 相反,我希望能够创建一个能够完成对象的解析器 下面是一个查询示例,该查询将英雄列表和变异发送到最喜爱的英雄。id(id)的解析程序只返回id的列表 type Query { heroes(first: Int = 10) [Hero] } type Hero { id: ID! title: String! } type Mutation { setFavori

假设我们有一个变异,它返回一个仅具有属性
id
的对象数组。要“完成”此类型,我们必须为此对象的每个属性创建一个解析器

相反,我希望能够创建一个能够完成对象的解析器

下面是一个查询示例,该查询将英雄列表和变异发送到最喜爱的英雄。
id(id)
的解析程序只返回
id
的列表

type Query {
  heroes(first: Int = 10) [Hero]
}

type Hero {
  id: ID!
  title: String!
}

type Mutation {
  setFavorite(id: ID!): [Hero]
}
const解析器={
查询:{
英雄({first},{heromes}){
返回英雄。获取({first});
}
},
突变:{
setFavorite({id},{favorites}){
等待收藏夹。设置收藏夹(id);
return favorites.getAll();//仅解析字段,因此您只能为字段而不是类型编写解析程序。您的选项包括:

  • 更改方法,如
    getAll
    ,以实际返回相关模型的实例,而不仅仅是返回ID

  • 将返回的ID映射到每个解析器内的模型实例

  • 为每个子字段编写解析程序:


请注意,我们在本例中使用了。这使我们能够批处理对
findById
的调用,并避免对同一id调用该方法两次。在没有DataLoader的情况下,您不应该使用此模式;否则,您将对数据库进行不必要的额外调用。

这是不可能的,但可以通过JS代理完成。这虽然uld经常遇到麻烦,但我能看到的唯一好处是在只请求ID字段时不调用解析程序。但有不同的解决方法。你能解释一下为什么不简单地映射变异解析程序中的ID值吗?
return favorites.getAll()。然后(ids=>Promise.all(ids.map(id=>heros.getOne({id})))
。更好的问题是,为什么像
收藏夹这样的方法。getAll
首先只返回ID。如果您真的只需要代码中其他地方的ID,只需公开两个单独的方法就可以了--
getAll
获取所有收藏夹,而
getallid
仅获取ID。
const resolvers = {
  Hero: {
    title: (id, args, ctx) => {
      const hero = await ctx.dataloaders.hero.findById(id)
      return hero.title
    },
    someOtherField: (id, args, ctx) => {
      const hero = await ctx.dataloaders.hero.findById(id)
      return hero.someOtherField
    },
  },
}