如何创建可以“完成”类型的GraphQL解析器

时间:2019-12-03 13:18:15

标签: graphql

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

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

在下面的查询示例中,该查询发送了英雄列表和最喜欢的英雄的变体。 mutation setFavorite(id)的解析器仅返回IDs的列表。

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

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

type Mutation {
  setFavorite(id: ID!): [Hero]
}
const resolvers = {
  Query: {
    heroes(_, {first}, {heroes}) {
      return heroes.get({first});
    }
  },
  Mutation: {
    setFavorite(_, {id}, {favorites}) {
      await favorites.setFavorite(id);
      return favorites.getAll(); // <<<< these are only IDs
    }
  }
}

是否可以创建“完成”类型的解析器?

const resolvers = {
  Hero: {
//  vvvvvv something like this
    __type(parent, _, {heroes}) {
      if (parent.id) {
        return heroes.getOne({id: parent.id});
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

只有字段是 resolved ,因此您只能为字段而不是类型编写解析器。您的选择是:

  • 更改类似public partial class AdminUIGI : FormBase.FormBase 之类的方法,以实际返回所讨论模型的实例,而不仅仅是返回ID。

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

  • 为每个子字段编写一个解析器:

getAll

请注意,在此示例中,我们使用dataloader。这样,我们就可以将对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 }, }, } 的调用进行批处理,并且避免为相同的ID两次调用该方法。如果没有DataLoader,则不应使用此模式;否则,您将收到不必要的数据库附加调用。