Должен / Могу ли я внести изменения в данные на вложенных преобразователях?
Скажи у меня есть MemberType
как это
import {
GraphQLID,
GraphQLList,
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
import readPhoneNumbersByMemberId from '../resolvers/readPhoneNumbersByMemberId'
import PhoneNumberType from './PhoneNumberType'
const MemberType = new GraphQLObjectType({
name: 'Member',
fields: {
id: {
type: new GraphQLNonNull(GraphQLID)
},
firstName: {
type: new GraphQLNonNull(GraphQLString)
},
lastName: {
type: new GraphQLNonNull(GraphQLString)
},
phoneNumbers: {
type: new GraphQLList(PhoneNumberType),
resolve: readPhoneNumbersByMemberId
}
}
})
export default MemberType
и PhoneNumberType
как это
import {
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
const PhoneNumberType = new GraphQLObjectType({
name: 'PhoneNumber',
fields: {
value: {
type: new GraphQLNonNull(GraphQLString)
}
}
})
export default PhoneNumberType
и QueryType
как это
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
readMembers: {
type: new GraphQLList(MemberType),
resolve: readMembers
}
}
})
Теперь, если я запрашиваю схему GraphQL для извлечения члена, функции разрешения readMembers
а также readPhoneNumbersByMemberId
будет вызываться для получения данных из источника.
Можно ли использовать тот же механизм для мутаций?
1 ответ
Вы можете, но не должны. преобразователи полей действительно созданы для извлечения данных. Помещение логики создания / обновления / удаления во вложенные средства распознавания может быстро стать проблематичным и привести к тем же проблемам, которые вы хотели бы решить с помощью graphql.
Это настолько обескураживает до такой степени, что Facebook создал целый специальный тип, называемый input
для любых составных объектов, которые отправляются в качестве аргументов для мутаций (или запроса).
Если вы можете объяснить преимущества разделения логики мутации, возможно, будет хорошей спецификацией RFC для GraphQL принять функцию мутации для каждого поля, таким образом вы будете сохранять логику мутации отдельной, достигая той же самой вложенной природы.
Если вы все еще хотите попробовать это, вы можете просто вернуть action
поле возвращаемого объекта из корневого преобразователя и внесите необходимые изменения во вложенные преобразователи, только если вы видите это поле. Убедитесь, что вы вернули данные, которые были изменены на вложенном преобразователе.