Apollo / GraphQL 具有不同参数的相同查询

Posted

技术标签:

【中文标题】Apollo / GraphQL 具有不同参数的相同查询【英文标题】:Apollo / GraphQL Same Query with Different Parameters 【发布时间】:2019-05-25 20:28:50 【问题描述】:

我将如何进行具有不同参数的 Apollo 查询。假设我的应用有用户的概念,我希望我的 API 能够通过 ID 或用户名找到用户。

我好像做不到

type Query 
  user(id: ID!): User
  user(username: String!): User

我必须求助于这样的事情

type Query 
  userById(id: ID!): User
  userByUsername(username: String!): User

【问题讨论】:

【参考方案1】:

创建一个以 ID 和用户名为字段的新输入类型,并将其指定为参数。

type Query 
  getUser(filters:UserFilter): User


input UserFilter
    ID : Int,
    Username : String

查询应该是这样的......

Query
 getUser(filters:ID:123123)

用户名过滤器的OR

Query
 getUser(filters:Username:"Tom")

【讨论】:

虽然我认为这取决于偏好,但我认为这种解决方案是最好的,无需重复使用不同名称的查询。 一个好的 GraphQL 模式清楚地定义了 API。在这种情况下,iduserName 是可选的,因此用法不清楚。最好严格定义提供的功能,按 id 查询或按用户名查询。当您有更复杂的查询时,这更有意义。【参考方案2】:

我相信你的第二个选项是最好的,但是你可以做这样的事情。

type Query 
  user(id: ID, username: String): User

如果不需要参数,那么您的解析器可以使用一些逻辑来确定它是否应该根据 id 或用户名获取用户。

if (args.id) 
  return getUserById(args.id)
 else 
  return getUserByUsername(args.username)

但是,由于本次演讲中提到的原因https://youtu.be/pJamhW2xPYw?t=750(可能在 12:30 左右看到),我相信您的第二个选项是更好的设计选择。希望对您有所帮助!

【讨论】:

感谢您的建议。我不喜欢这个答案,因为我相信它让 API 从用户的角度有点难以理解。我将把这个问题留到明天,如果没有人能提供更好的选择,我会接受你的回答。 据youtu.be/pJamhW2xPYw?t=1169 演讲者喜欢汤米的方式 @YegorZaremba,很棒的参考,完全同意视频中的一位演讲者

以上是关于Apollo / GraphQL 具有不同参数的相同查询的主要内容,如果未能解决你的问题,请参考以下文章

具有动态键的对象的 Apollo/GraphQL 字段类型

具有动态键的对象的 Apollo/GraphQL 字段类型

具有动态键的对象的 Apollo/GraphQL 字段类型

具有多个别名和 Apollo (Vue.js) 的 GraphQL 查询

具有嵌套字段类型条件的 Apollo graphql 查询

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型