Apollo GraphQL无法为嵌套字段调用解析器

时间:2018-11-07 15:00:06

标签: graphql apollo apollo-server

我的架构中具有以下结构:

type gn_Feature implements Some_Interface {
  s_description: String
  s_id: URL!
  some_parent: gn_Feature
}

如您所见,每个gn_Feature都有另一个链接的gn_Feature对象(链接是在其他地方处理的,这并不重要)。根据我目前的理解,您只需要为返回的 类型 定义解析器,所以我的解析器如下所示:

export const resolvers = Object.assign(
  {},
  {
    DateTime: DateTime,
    Date: DateTime,
    Time: RegularExpression("Time", /^\d{2}:\d{2}(:\d{2})?$/),
    URL,
    Query: {
       gn_Feature: gn_FeatureResolver
    },
    gn_Feature: gn_FeatureResolver
  }
);

但是,如果我没有为 nested 字段明确定义解析器,我的查询就会失败,并显示以下错误:

gn_Feature: {some_parent: gn_FeatureResolver}

错误:

  

“ message”:“ \” gn_Feature.s_description \的解析功能“   返回未定义”

当我不像上面那样指定嵌套对象时,我的解析器函数甚至都不会被调用。 我的后端包括将GraphQL查询转换为SparQL查询的一些伏都教,这些SvoQL查询返回数据,因此我不会发布解析器代码,因为我在多个字段中使用了一个通用解析器。我想避免为每个嵌套字段指定解析器,因为这将非常繁琐(我有数十种类型和数十种字段)。欢迎您做出任何澄清,因为我完全感到困惑。

GraphQL查询示例:

gn_Feature(some_field:"AD", last:2){
  s_description,
  s_id
  some_parent{
    s_description 
  }
}

1 个答案:

答案 0 :(得分:1)

执行查询时,最初只有一个特定字段的值是未知的,需要解析 ...其他所有其他信息,例如类型,选择集等,都是已知的。解析程序是一种用于解析特定字段的函数。在GraphQL.js中,没有类型的解析器。

在这方面,Apollo有点让人困惑,因为为方便起见,makeExecutableSchema的API允许您通过将自定义标量包含在解析器映射中来定义它们。此外,即使接口和联合都没有解析器,Apollo也允许您使用解析器映射为这些抽象类型指定一个__resolveType函数。 Apollo的文档实际上将解析器定义为“将架构字段和类型连接到各种后端的函数”。但是,通常在GraphQL的上下文中,您应该将解析器视为“解析字段值的函数”。

因此,给定一个名为gn_Feature的类型和一个名为some_parent的字段,此 是构造解析器的正确方法:

const resolvers = {
  gn_Feature: {
    some_parent: someResolverFunction
  }
}

还要注意,QueryMutation本身都是类型,因此,如果您有一个名为gn_Feature的查询,则实际上是在为{ {1}}类型。