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

Apollo GraphQL无法为嵌套字段调用解析器,graphql,apollo,apollo-server,Graphql,Apollo,Apollo Server,我的模式中有以下结构: type gn_Feature implements Some_Interface { s_description: String s_id: URL! some_parent: gn_Feature } 如您所见,每个gn\u功能都有另一个链接的gn\u功能对象(链接在别处处理,这并不重要)。根据我目前的理解,您只需要为返回类型定义解析程序,因此我的解析程序如下所示: export const resolvers = Object.assign( {}

我的模式中有以下结构:

type gn_Feature implements Some_Interface {
  s_description: String
  s_id: URL!
  some_parent: gn_Feature
}
如您所见,每个
gn\u功能
都有另一个链接的
gn\u功能
对象(链接在别处处理,这并不重要)。根据我目前的理解,您只需要为返回类型定义解析程序,因此我的解析程序如下所示:

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
  }
);
但是,如果我没有为嵌套字段显式定义解析程序,查询将失败,并出现以下错误,如下所示:

gn\u功能:{some\u parent:gn\u FeatureResolver}

错误:

“消息”:“gn\U功能的解析功能。s\U说明” 返回未定义“

当我没有像上面那样指定嵌套对象时,我的解析器函数甚至不会被调用。 我的后端包含一些将GraphQL查询转换为SparQL查询的巫毒术,SparQL查询返回数据,因此我不会发布解析器代码,因为我对许多字段使用一个通用解析器。我希望避免为每个嵌套字段指定解析程序,因为这将非常繁琐(我有几十种类型和几十个字段)。任何澄清都是受欢迎的,因为我完全困惑不解

GraphQL查询示例:

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

执行查询时,只有任何特定字段的值最初是未知的,需要解析。。。其他一切,如类型、选择集等,都是已知的。解析程序是为解析特定字段而调用的函数。在GraphQL.js中,类型没有解析程序

Apollo在这方面有些混乱,因为为了方便起见,
makeExecutableSchema
的API允许您通过将自定义标量包含在解析器映射中来定义它们。此外,即使接口和联合也没有冲突解决程序,Apollo也允许您使用冲突解决程序映射为这些抽象类型指定
\uu resolveType
函数。Apollo的文档实际上将解析器定义为“将模式字段和类型连接到各种后端的函数”。然而,在一般的GraphQL上下文中,您应该将解析器视为“解析字段值的函数”

因此,给定一个名为
gn\u Feature
的类型和一个名为
some\u parent
的字段,这是构建解析器的正确方法:

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

还要注意的是
Query
Mutation
本身都是类型,因此如果您有一个名为
gn\u Feature
的查询,您实际上是在为
Query
类型解析一个名为
gn\u Feature
的字段。

谢谢您的详细解释,我担心这是唯一的方法。可能是以不同的方式处理模式的问题,但是如果没有看到它和您正在处理的数据类型,就很难知道。