【问题标题】:Apollo GraphQL fails to invoke resolver for a nested fieldApollo GraphQL 无法为嵌套字段调用解析器
【发布时间】:2018-11-07 23:45:51
【问题描述】:

我的架构中有以下结构:

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

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

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 查询的巫术转换,这些查询返回数据,因此我不会发布解析器代码,因为我对许多字段使用一个通用解析器。我想避免为每个嵌套字段指定解析器,因为这将非常乏味(我有几十个类型和几十个字段)。欢迎任何澄清,因为我完全感到困惑。

GraphQL 查询示例:

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

【问题讨论】:

    标签: graphql apollo apollo-server


    【解决方案1】:

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

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

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

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

    还要注意Query 和Mutation 本身都是类型,所以如果您有一个名为gn_Feature 的查询,您实际上是在为Query 类型解析一个名为gn_Feature 的字段。

    【讨论】:

    • 感谢您的详细解释,我担心这是唯一的方法..
    • 可能是一个以不同方式处理您的架构的问题,但如果没有看到它以及您正在使用的数据类型就很难知道。
    猜你喜欢
    • 2018-08-27
    • 2021-07-28
    • 2017-01-11
    • 2019-05-18
    • 2021-07-20
    • 2018-08-25
    • 2020-01-28
    • 2017-04-15
    • 2019-11-06
    相关资源
    最近更新 更多