У меня есть запрос graphql, подобный следующему:
userInfo (id: userId) {
name
email
address {
street
country
}
}
Таким образом, name и email будут разрешены конечной точкой покоя, называемой details, однако поля address должны быть разрешены другой конечной точкой покоя, называемой address. address конечная точка отдыха также нуждается в userId, переданном в userInfo (поскольку моя служба отдыха ожидает это поле). Я не уверен, как я могу разработать свой преобразователь в этом случае?
В том же отношении, может ли поле после разрешения отправлять данные в другое поле? Возможно ли это в grapqhql?


В GraphQL каждое поле называется решать для определенного значения. В GraphQL.js это значение равно любому значению, которое было возвращено распознавателем, или, если распознаватель вернул промис, независимо от того, к чему это промис разрешил. Это значение передается распознавателю каждого дочернего поля в качестве первого параметра.
На практике это означает, что даже если ваш тип имеет определенные поля и возвращаемый вами объект должен соответствовать этим полям, он также может включать любое количество свойств дополнительный.
Например, ваш преобразователь userInfo может выглядеть примерно так:
async (parent, args, context, info) => {
const { name, email } = await getDetails(args.id)
return {
name
email
id: args.id,
}
}
Даже если у вас нет поля id, мы все равно можем включить его в возвращаемый объект. Таким образом, мы можем передать некоторую дополнительную информацию, например наши аргументы, преобразователям любых дочерних полей. Затем внутри вашего преобразователя address:
async (parent, args, context, info) => {
// `parent` contains `name`, `email` and `id` properties
return getAddress(parent.id)
}
Я бы добавил (к ответу @daniel), что вы можете явно передать этот идентификатор в запросе (без изменений преобразователя address).
userInfo (id: userId) {
name
email
address (userID: userId) {
street
country
}
}
Чтобы сделать его (address резолвер) универсальным, мы можем использовать оба источника параметров:
async (parent, args, context, info) => {
// `parent` (user) can contain `id` property
return getAddress(args.userID ? args.userID : parent.id)
}
потому что у вас должна быть возможность запрашивать только адрес (для данного userId), как это возможно с остальным API.