如何为 apollo 客户端生成片段类型?

Posted

技术标签:

【中文标题】如何为 apollo 客户端生成片段类型?【英文标题】:How do I generate fragment types for apollo client? 【发布时间】:2020-01-19 22:33:20 【问题描述】:

我有一个使用 apollo-client 用 reason-react 编写的应用程序。我在前端定义了一些片段,基本上可以重用一些字段定义。我正在为使用片段的组件设置自动化测试,但我不断收到此警告,说我需要使用 IntrospectionFragmentMatcher

'You are using the simple (heuristic) fragment matcher, but your queries contain union or interface types. Apollo Client will not be able to accurately map fragments. To make this error go away, use the `IntrospectionFragmentMatcher` as described in the docs: https://www.apollographql.com/docs/react/advanced/fragments.html#fragment-matcher'

我尝试根据docs 设置片段匹配器。 codegen 结果不返回任何类型:


  "__schema": 
    "types": []
  

当我查询我的服务器并查看 apollo-client 推荐的手动方法时,我注意到它也不会返回任何类型。

另一个奇怪的事情是,当我不使用片段匹配器时,我得到了模拟的响应,但我只是得到了来自 apollo 的警告。如果我确实使用它,那么模拟的响应不会正确返回。

为什么我要在 graphql api 中查询我的前端代码中定义的片段?为什么我只会在运行测试和使用模拟数据时收到这些错误,而不是在运行我的实际应用程序时?

【问题讨论】:

【参考方案1】:

如错误所述,默认片段匹配器不适用于交集或联合类型。您将需要使用 Apollo 的 IntrospectionFragmentMatcher。它的工作原理是向服务器(自省)询问有关您的模式类型的信息,然后提供该信息以供缓存参考,以便它可以准确地匹配字段。它不是向服务器查询有关您在前端定义的片段的信息,而是询问有关必须在后端定义的 GraphQL 模式的数据,以便它可以正确地将两者关联起来。文档中有一个示例,还有更多信息here。

至于为什么您的服务器没有返回任何类型,这是一个单独的问题,需要更多信息才能调试。如果您使用的是 Apollo 服务器,请仔细检查您的架构,以确保正确定义了所有必要的类型,并且在初始化时将它们传递给服务器。

【讨论】:

知道为什么我只会在运行测试时收到此警告吗?在本地或生产中运行应用程序时,我根本没有收到警告。我确信所有类型都已正确定义,因为原因提供了针对模式的类型检查。 您是在测试中模拟数据还是使用实时服务器?如果您发布您的测试代码,我可以看看 我想我将它归结为这个库中的一个错误:github.com/mhallin/graphql_ppx,因为当我删除 @bsRecord 指令时它可以在没有警告的情况下工作。

以上是关于如何为 apollo 客户端生成片段类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Apollo GraphQL 客户端禁用 InMemoryCache?

如何为具有共享类型的多个 WCF 服务生成客户端代码

如何为graphql查询转义变量

如何为graphql查询转义变量

从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象

Apollo 客户端片段不嵌入数据