Ошибка: тип поля должен быть 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},
...
})
});