【问题标题】:How can I define resolver for object type in graphql-js?如何在 graphql-js 中为对象类型定义解析器?
【发布时间】:2020-07-21 21:25:54
【问题描述】:

我的应用程序中有许多 graphql 类型。

我使用 graphql-js 来构建它们。

// example
const TruckDriver: GraphQLObjectType = new GraphQLObjectType({
  name: 'TruckDriver',
  fields: () => ({
    id: { type: GraphQLString },
  }),
})

然后我在不同的查询和突变中导入这些类型来定义返回值的类型。

但我的解析器不返回对象,它们返回字段信息位于嵌套属性“info”中的类的实例。例如上面的解析器将返回

{
   info: {
     id: '123'
   }
   ...
}

我想在我的类型中添加解析器,但我发现类型没有解析器。

如何轻松实现对象类型的字段数据解析逻辑?

【问题讨论】:

标签: graphql graphql-js


【解决方案1】:

您可以为每个单独的字段指定一个解析器,如下所示:

const TruckDriver: GraphQLObjectType = new GraphQLObjectType({
  name: 'TruckDriver',
  fields: () => ({
    id: {
      type: GraphQLString
      resolve: truck => truck.info.id
    },
  }),
})

或修改 Query 和 Mutation 字段的解析器以返回适当形状的对象。类似的东西

async function resolve () {
  const trucks = await getTrucks()
  return trucks.map(truck => truck.info)
}

【讨论】:

  • 这不是办法。我想在类型中做到这一点。我有大约 200 种实体类型以及它们之间的许多关系。我想在类型定义级别找到方法
  • 响应中返回的值是在字段级别确定的,而不是类型级别。没有“简单”的方法来做你想做的事情。你可以将映射逻辑提取到一个高阶函数中,并用它包装你的解析器,如果你想让事情变得更干燥,但归根结底,你将不得不做映射,因为形状返回解析器与架构中定义的形状不匹配。
  • 您可以想象循环遍历每个类的属性列表和programmatically define a getter 的每个属性,将其从info 中拉出。
猜你喜欢
  • 2020-10-04
  • 2020-03-17
  • 2019-10-01
  • 2020-09-29
  • 2020-02-21
  • 2021-01-09
  • 1970-01-01
  • 2018-10-04
  • 2017-08-13
相关资源
最近更新 更多