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

时间:2019-09-18 23:03:04

标签: graphql apollo-client

我有一个使用apollo-client写的具有理性反应的应用程序。我在前端定义了一些片段,以基本上重用一些字段定义。我正在为使用片段的组件设置自动化测试,但是我不断收到此警告,提示我需要使用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设置片段匹配器。代码生成结果不返回任何类型:

{
  "__schema": {
    "types": []
  }
}

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

另一个奇怪的事情是,当我不使用片段匹配器时,我得到了模拟响应,但是我只是从阿波罗那里得到了警告。如果我确实使用它,那么模拟的响应将无法正确返回。

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

1 个答案:

答案 0 :(得分:0)

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

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