Полагаю, вы имеете в виду что-то вроде:
type Query {
getusers: [User]!
getusers(id: ID!): User
getusers(name: String!): User
}
ИМХО, лучше всего попробовать.Вы должны получить сообщение о том, что Query.getusers может быть определено только один раз, что ответит на ваш вопрос.
GraphQL - это только логический слой, и если вы учитываете технический аспект, то естьраспознаватель (и), вы можете получить представление о том, почему он ведет себя так.
Резолверы - это простые функции, хранящиеся внутри простых JS-объектов по путям, указанным в имени запроса / мутации / подписки.Очевидно, что в объектах JS не может быть более одного пути с одинаковым именем.Это означает, что вы можете определить только один распознаватель для данного имени запроса, поэтому все три getusers будут отображаться на одну и ту же функцию 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
Цитата:
Каждое определение именованной операции должно быть уникальным в документе, если на него ссылается егоимя.