graphql-具有不同参数的相同查询

时间:2018-06-04 20:58:15

标签: graphql

可以通过图形ql实现以下目标: 我们有getusers() / getusers(id=3) / getusers(name='John)。我们可以使用相同的查询来接受不同的参数(参数)吗?

2 个答案:

答案 0 :(得分:2)

我认为您的意思是:

type Query {
    getusers: [User]!
    getusers(id: ID!): User
    getusers(name: String!): User
}

恕我直言,最好的办法是尝试。您应该会收到一条错误消息,说 Query.getusers 只能定义一次,这将回答您的问题。

GraphQL只是一个逻辑层,如果您考虑技术方面(即解析器),则可能会了解其行为为何如此。

解析器是简单的函数,存储在普通JS对象中,位于查询/变异/订阅名称指定的路径下。显然,在JS对象中,具有相同名称的路径不能超过一个。这意味着您只能为给定的查询名称定义一个解析器,因此所有三个getuser都将映射到同一函数 Query.getusers(obj,args,ctx,info)

这意味着即使GraphQL允许使用相同名称的字段,在解析器中,您仍然必须显式检查是否已传递任何参数,即 if(args.id){...} else if(args.name){...} 等。

在您的情况下,实现此目的的一种方法是定义这样的输入类型:

input GetUserInput {
    id: ID
    name: String
}

然后:

type Query {
    getusers(input: GetUserInput)
}

最后的笔记。 GraphQL在概念上与REST不同,因此从三个端点(/ users,/ users /:id和/ users /:name)的角度考虑甚至完全没有意义,我想您正在这样做。在我的观点(!)中,最好推理出暴露的方法,然后像这样定义查询:

type Query {
    users: [User]!
    usersByName(name: String!): [User]!
    user(id: ID!): User
}

编辑

实际的规范是这样的东西无效:http://facebook.github.io/graphql/June2018/#example-5e409

报价:

每个命名操作定义在用其名称引用时在文档中必须是唯一的。

答案 1 :(得分:0)

该类型的请求有效:

Query {
    first:getusers(), 
    second:getusers(id=3)
    third:getusers(name='John)
}