Должен / Могу ли я внести изменения в данные на вложенных преобразователях?

Скажи у меня есть 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 поле возвращаемого объекта из корневого преобразователя и внесите необходимые изменения во вложенные преобразователи, только если вы видите это поле. Убедитесь, что вы вернули данные, которые были изменены на вложенном преобразователе.

Другие вопросы по тегам