【问题标题】:Apollo / GraphQL Same Query with Different ParametersApollo / GraphQL 具有不同参数的相同查询
【发布时间】: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
}

【问题讨论】:

    标签: graphql apollo-server


    【解决方案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,很棒的参考,完全同意视频中的一位演讲者
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 2021-04-03
    • 2021-08-14
    • 2019-07-30
    • 2018-07-09
    • 2016-12-12
    • 2018-02-01
    • 2020-05-13
    相关资源
    最近更新 更多