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。在这种情况下,id
和 userName
是可选的,因此用法不清楚。最好严格定义提供的功能,按 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 具有不同参数的相同查询的主要内容,如果未能解决你的问题,请参考以下文章