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

Apollo/GraphQL具有不同参数的相同查询,graphql,apollo-server,Graphql,Apollo Server,我将如何使用不同的参数进行Apollo查询。假设我的应用程序有用户的概念,我希望我的API能够通过ID或用户名找到用户 看来我做不到 type Query { user(id: ID!): User user(username: String!): User } 我必须求助于这样的事情吗 type Query { userById(id: ID!): User userByUsername(username: String!): User } 我相信你的第二个选择是最好的,但

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

看来我做不到

type Query {
  user(id: ID!): User
  user(username: String!): User
}
我必须求助于这样的事情吗

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

我相信你的第二个选择是最好的,但是你可以这样做

type Query {
  user(id: ID, username: String): User
}
如果不需要这些参数,那么您的解析器可以使用一些逻辑来确定是否应该基于id或用户名获取用户

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

然而,由于在12:30左右讨论的原因,我相信您的第二个选择是一个更好的设计选择。希望有帮助

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

type Query {
  getUser(filters:UserFilter): User
}

input UserFilter{
    ID : Int,
    Username : String
}
查询应该如下所示

Query{
 getUser(filters:{ID:123123})
}
或用于用户名筛选器

Query{
 getUser(filters:{Username:"Tom"})
}

谢谢你的建议。我不喜欢这个答案,因为我认为它让API从用户角度看有点难以理解。我将把这个问题留到明天,如果没有人能提供更好的选择,我将接受你的答案。据演讲者说,我更喜欢汤米的答案way@YegorZaremba,非常好的参考资料,完全同意视频中的一位演讲者的观点虽然我认为这取决于偏好,但我认为这种解决方案是最好的,不必使用不同的名称重复查询。良好的GraphQL模式清楚地定义了API。在这种情况下,id和用户名是可选的,因此用法不清楚。最好严格定义提供的功能,按id查询或按用户名查询。当您有更复杂的查询时,这就更有意义了。