GrapQHL Apollo Server,提取值并在解析器中使用它们
Posted
技术标签:
【中文标题】GrapQHL Apollo Server,提取值并在解析器中使用它们【英文标题】:GrapQHL Apollo Server, extract values and use them in a resolver 【发布时间】:2020-10-26 22:39:50 【问题描述】:我有一个请求数据的 GraphQL API。请求的数据包含我想要调用更多数据并在单独的解析器中解析的 id。假设我有这样的架构:
type Query
catchSomeData: [SomeData]!
specialTypes: [SpecialType]!
type SomeData
someDataId: Int!
key: String!
specialTypeIdA: Int! @collect
specialTypeIdB: Int! @collect
type SpecialType
specialTypeId: Int!
name: String!
someValue: String!
查询如下所示:
query
catchSomeData
someDataId
key
specialTypeIdA
specialTypeIdB
specialTypes
specialTypeId
name
someValue
当catchSomeData
解决后,我希望收集specialTypeIdA
和specialTypeIdB
的所有ID。我使用 Id 从 specialTypes
解析器中的数据库中获取数据。
我设法构建了一个指令来收集 Id 并将其存储在 context
变量中。由于我使用 Apollo Server,catchSomeData
和 specialTypes
的解析器同时执行。所以当specialTypes
的代码被执行时,ID 还没有被收集。
任何想法如何以有效的方式解决问题?
【问题讨论】:
【参考方案1】:要回答您的问题,不,您不能这样做。查询执行不能保证按照您所描述的顺序发生,结果应该是您所看到的。
但现在退后一步,感觉就像您正在以非常 REST 的方式处理这个问题。在 catchSomeData
和 specialTypes
之间没有兄弟姐妹,GraphQL 的方式是嵌套这些对象:
type Query
catchSomeData: [SomeData]!
specialTypes: [SpecialType]!
type SomeData
someDataId: Int!
key: String!
specialTypeIdA: SpecialType!
specialTypeIdB: SpecialType!
type SpecialType
specialTypeId: Int!
name: String!
someValue: String!
然后您的查询将是
query
catchSomeData
someDataId
key
specialTypeIdA
specialTypeId
name
someValue
specialTypeIdB
specialTypeId
name
someValue
或者如果您不想输入两次嵌套的内容,您可以使用片段:
query
catchSomeData
someDataId
key
specialTypeIdA
...specialData
specialTypeIdB
...specialData
fragment specialData on SpecialType
specialTypeId: Int!
name: String!
someValue: String!
然后我建议您查看DataLoader,了解如何进行批量查找。
【讨论】:
我想过这样的解决方案,问题是我需要获取很多特殊类型,而且它们通常是相同的。使用这种方法,我最终会得到大量冗余数据。我想我需要请求一个查询,等待结果返回,然后提取所有 specialTypeId 并发送第二个查询。 冗余数据,通过字节传输是的,但它也以您的 API 使用者希望的方式正确嵌套。如果您遇到“数据过多”的问题,您可能只是在查询过多的数据。退后一步:您实际上是在单个客户端视图中显示所有这些吗?你应该吗?此外,使用 GraphQL,您永远不必让客户端对页面上的数据进行两次调用。【参考方案2】:您可以使用突变,因为它保留了根解析器的顺序。
【讨论】:
以上是关于GrapQHL Apollo Server,提取值并在解析器中使用它们的主要内容,如果未能解决你的问题,请参考以下文章
Apollo 客户端/使用 localhost 反应本机错误
如何使 Flutter graphql 订阅与轮渡包一起使用?
如何在 apollo graphQL 服务器的枚举值中添加特殊字符?