GraphQL 操作名称是不是会改变查询行为?
Posted
技术标签:
【中文标题】GraphQL 操作名称是不是会改变查询行为?【英文标题】:Does a GraphQL Operation Name Ever Change Query Behavior?GraphQL 操作名称是否会改变查询行为? 【发布时间】:2019-09-19 14:14:36 【问题描述】:我是 GraphQL 的超级新手。我仍在了解基本概念和语言。在问我的问题时,我可能会说一些严重错误的话——如果我这样做,我会很感激更正。
小问题:操作的名称对查询的行为有影响吗?
也就是说,我的理解是,给定一个看起来像这样的 GraphQL 查询
query SomeQueryName
flower
name
petal_number
其中query
是操作类型,SomeQueryName
是操作名称。
在解析查询时是否使用过这些名称?或者它们是否严格地是客户端程序员在编写查询时可以包含的东西,以帮助他们组织自己的代码?或者其他一些我没有想到的事情。
【问题讨论】:
【参考方案1】:查询名称对服务器没有任何意义。解析查询时不使用它,仅使用查询的内容。所以你的例子相当于这个:
query
flower
name
petal_number
该名称仅用于前端的 GraphQL 客户端或用于调试目的。
【讨论】:
【参考方案2】:操作的名称与解析操作中的字段无关。 然而,当单个 GraphQL 文档中存在多个操作定义时,它是相关的。 From the spec:
要执行一个请求,如果文档定义了多个操作,则执行器必须有一个解析的文档和一个选定的操作名称才能运行,否则文档应该只包含一个操作。
换句话说,您的请求可能包含这样的文档:
query Query1
someField
query Query2
someOtherField
当存在多个命名操作时,客户端还必须指定operationName
参数(除了query
和variables
)。通过这样做告诉 GraphQL 服务执行该特定操作并忽略所有其他操作。发送多个操作而不指定operationName
——或包含多个未命名操作将导致请求失败。
在上述之外,正如@jo_va 所提到的,提供操作名称的唯一其他目的是用于调试或供客户端使用。例如,apollo-link-watched-mutation
使用操作名称来解决 Apollo 客户端的常见缓存问题。
【讨论】:
以上是关于GraphQL 操作名称是不是会改变查询行为?的主要内容,如果未能解决你的问题,请参考以下文章
Gatsby - GraphQL - StaticQuery 标签 - 由于查询字符串的奇怪行为,站点无法编译