Apollo GraphQL 无法为嵌套字段调用解析器
Apollo GraphQL fails to invoke resolver for a nested field
我的架构中有以下结构:
type gn_Feature implements Some_Interface {
s_description: String
s_id: URL!
some_parent: gn_Feature
}
如您所见,每个 gn_Feature
都有另一个链接的 gn_Feature
对象(链接在别处处理,这并不重要)。根据我目前的理解,您只需要为 return 类型 定义解析器,因此我的解析器如下所示:
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": "Resolve function for \"gn_Feature.s_description\"
returned undefined"
当我没有像上面那样指定时,我的解析器函数甚至不会为我的嵌套对象调用。
我的后端包含一些将 GraphQL 查询转换为 SparQL 查询的巫术,这些查询 return 返回数据,因此我不会 post 解析器代码,因为我在许多领域使用一个通用解析器。我想避免必须为每个嵌套字段指定解析器,因为这将非常乏味(我有几十种类型和几十个字段)。欢迎任何澄清,因为我完全困惑。
GraphQL 查询示例:
gn_Feature(some_field:"AD", last:2){
s_description,
s_id
some_parent{
s_description
}
}
执行查询时,只有任何特定字段的值最初是未知的,需要解析...其他所有内容,如类型、选择集等。已经知道了。解析器是为解析特定字段而调用的函数。在 GraphQL.js 中,没有类型解析器。
Apollo 在这方面有点混淆视听,因为为了方便起见,makeExecutableSchema
的 API 允许您通过将自定义标量包含在解析器映射中来定义它们。此外,即使接口和联合也没有解析器,Apollo 也允许您使用解析器映射为这些抽象类型指定一个 __resolveType
函数。 Apollo 的文档实际上将解析器定义为 "a function that connects schema fields and types to various backends." 但是,在一般的 GraphQL 上下文中,您应该将解析器视为 "a functions that resolves the value of a field".
因此,给定一个名为 gn_Feature
的类型和一个名为 some_parent
的字段,此 是 构造解析器的正确方法:
const resolvers = {
gn_Feature: {
some_parent: someResolverFunction
}
}
另请注意 Query
和 Mutation
本身都是类型,因此如果您有一个名为 gn_Feature
的查询,您实际上是在解析一个名为 gn_Feature
的字段Query
类型。
我的架构中有以下结构:
type gn_Feature implements Some_Interface {
s_description: String
s_id: URL!
some_parent: gn_Feature
}
如您所见,每个 gn_Feature
都有另一个链接的 gn_Feature
对象(链接在别处处理,这并不重要)。根据我目前的理解,您只需要为 return 类型 定义解析器,因此我的解析器如下所示:
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": "Resolve function for \"gn_Feature.s_description\" returned undefined"
当我没有像上面那样指定时,我的解析器函数甚至不会为我的嵌套对象调用。 我的后端包含一些将 GraphQL 查询转换为 SparQL 查询的巫术,这些查询 return 返回数据,因此我不会 post 解析器代码,因为我在许多领域使用一个通用解析器。我想避免必须为每个嵌套字段指定解析器,因为这将非常乏味(我有几十种类型和几十个字段)。欢迎任何澄清,因为我完全困惑。
GraphQL 查询示例:
gn_Feature(some_field:"AD", last:2){
s_description,
s_id
some_parent{
s_description
}
}
执行查询时,只有任何特定字段的值最初是未知的,需要解析...其他所有内容,如类型、选择集等。已经知道了。解析器是为解析特定字段而调用的函数。在 GraphQL.js 中,没有类型解析器。
Apollo 在这方面有点混淆视听,因为为了方便起见,makeExecutableSchema
的 API 允许您通过将自定义标量包含在解析器映射中来定义它们。此外,即使接口和联合也没有解析器,Apollo 也允许您使用解析器映射为这些抽象类型指定一个 __resolveType
函数。 Apollo 的文档实际上将解析器定义为 "a function that connects schema fields and types to various backends." 但是,在一般的 GraphQL 上下文中,您应该将解析器视为 "a functions that resolves the value of a field".
因此,给定一个名为 gn_Feature
的类型和一个名为 some_parent
的字段,此 是 构造解析器的正确方法:
const resolvers = {
gn_Feature: {
some_parent: someResolverFunction
}
}
另请注意 Query
和 Mutation
本身都是类型,因此如果您有一个名为 gn_Feature
的查询,您实际上是在解析一个名为 gn_Feature
的字段Query
类型。