Ошибка: тип поля должен быть Input Type - нельзя передать qlType в мутацию

Я хочу обновить person с UpdatePerson мутации. Я не хочу указывать каждое свойство в inputFields - а точнее хочу передать человеку полный объект.

Когда я делаю это, я получаю Error: UpdatePersonInput.person field type must be Input Type but got: Person.

Нет ли способа передать полные объекты, а не все их свойства мутации?

Если нет, не могли бы вы добавить один - потому что количество повторений полей в более крупном приложении с большими объектами может стать очень разочаровывающим.

То же самое может быть проблемой на getFatQuery а также static fragments, Повторять все свойства снова и снова было бы кошмаром.

Сервер:

/**
 * Create the GraphQL Mutation.
 */
export default mutationWithClientMutationId({
  // Mutation name.
  name: 'UpdatePerson',
  // Fields supplied by the client.
  inputFields: {
    person: {type: qlPerson} // <========================================
  },
  // Mutated fields returned from the server.
  outputFields: {
    person: {
      type: qlPerson,
      // Parameters are payload from mutateAndGetPayload followed by outputFields.
      resolve: (dbPerson, id, email) => {
        return dbPerson;
      }
    }
  },
  // Take the input fields, process the mutation and return the output fields.
  mutateAndGetPayload: ({qlPerson}, {rootValue}) => {
    // TODO: Process Authentication {"session":{"userId":1}}
    console.log(JSON.stringify(rootValue));
    // Convert the client id back to a database id.
    var localPersonId = fromGlobalId(qlPerson.id).id;
    // Find the person with the given id in the database.
    return db.person.findOne({where: {id: localPersonId}}).then((dbPerson)=> {
      // Mutate the person.
      dbPerson.email = qlPerson.email;
      // Save it back to the database.
      return dbPerson.save().then(()=> {
        // Return the mutated person as an output field.
        return dbPerson;
      });
    });
  }
});

Клиент:

/**
 * Create the GraphQL Mutation.
 */
class UpdatePersonMutation extends Relay.Mutation {
  getMutation() {
    return Relay.QL`mutation {updatePerson}`;
  }

  getVariables() {
    return {person: this.props.person};  // <========================================
  }

  getFatQuery() {
    return Relay.QL`
      fragment on UpdatePersonPayload {
        person {
          email,    // ??????????????????????????
        }
      }
    `;
  }

  getConfigs() {
    return [{
      type: 'FIELDS_CHANGE',
      fieldIDs: {
        person: this.props.person.id
      }
    }];
  }

  static fragments = {
    person: () => Relay.QL`
      fragment on Person {
        id,
        email     // ???????????????????????????
      }
    `
  };

  getOptimisticResponse() {
    return {
      person: this.props.person
    };
  }
}

/**
 * Exports.
 */
export default UpdatePersonMutation;

1 ответ

Это ошибка, потому что ваш qlPerson тип был определен с помощью GraphQLObjectType класс, который не является типом ввода. Вы должны определить это, используя GraphQLInputObjectType вместо. По сути, оба они принимают объект в качестве аргумента, который требует одинаковых свойств. Итак, вам просто нужно использовать GraphQLInputObjectType вместо GraphQLObjectType следующим образом:

export default new GraphQLInputObjectType({
   name: 'qlPerson',
   description: 'Dietary preferences',
   fields: () => ({
     firstName: {type: GraphQLString},
     ...
   })
 });
Другие вопросы по тегам