在 Apollo 中查找缺失的 GraphQL 解析器

Posted

技术标签:

【中文标题】在 Apollo 中查找缺失的 GraphQL 解析器【英文标题】:Find Missing GraphQL Resolvers in Apollo 【发布时间】:2020-06-27 00:53:35 【问题描述】:

使用apollo-server,如果我尝试定义架构中不存在的graphql 解析器,计算机就会对我大喊大叫。

[错误:Query.foo 在解析器中定义,但不在架构中]

这很好!

是否有可能,使用阿波罗(或其他?)工具,做相反的事情?也就是说,有没有办法让 apollo 告诉我是否在我的架构中定义了查询、突变或订阅操作,但 没有 在我的解析器中定义?

【问题讨论】:

【参考方案1】:

有一个可选的resolverValidationOptions 对象可以传递给makeExecutableSchema 以强制执行一些额外的解析器验证,如here 所示:

如果没有为具有参数的字段定义解析函数,requireResolversForArgs 将导致 makeExecutableSchema 引发错误。 如果非标量字段没有定义解析器,requireResolversForNonScalar 将导致 makeExecutableSchema 抛出错误。将此设置为 true 有助于捕获错误,但默认为 false 以避免混淆来自其他 GraphQL 库的行为。 requireResolversForAllFields 断言所有字段都具有有效的解析函数。 requireResolversForResolveType 将需要 resolveType() 方法用于接口和联合类型。这可以通过字段解析器作为 __resolveType() 传入。 False 以禁用警告。 allowResolversNotInSchema 关闭在找到架构中不存在的解析器时引发错误的功能。默认为false,以帮助捕获常见错误。

没有一个专门针对根类型上的only字段,但您可以使用一个或多个。

这些选项不会直接通过 ApolloServer 公开,但您始终可以这样做:

const schema = makeExecutableSchema( typeDefs, resolvers, resolverValidationOptions )
const apollo = new ApolloServer( schema )

【讨论】:

以上是关于在 Apollo 中查找缺失的 GraphQL 解析器的主要内容,如果未能解决你的问题,请参考以下文章

在 apollo-server 中将网关上的联合类型转换为服务 GraphQL 中的标量类型

如何告诉 apollo codegen 查找查询的确切文件

apollo (graphQL) - 如何在查询中发送对象数组

在 apollo (graphql) 查询中无法识别 FlowRouter

Node/Apollo/GraphQL - 关于在 Apollo 服务器插件中使用 async/await 的建议

在 GraphQL 和 Apollo 中检索数组