我正在通过阅读todo样本来学习graphql / relay。
突变模式定义如下:
const GraphQLChangeTodoStatusMutation = mutationWithClientMutationId({
name: 'ChangeTodoStatus',
inputFields: {
complete: { type: new GraphQLNonNull(GraphQLBoolean) },
id: { type: new GraphQLNonNull(GraphQLID) },
},
outputFields: {
todo: {
type: GraphQLTodo,
resolve: ({localTodoId}) => getTodo(localTodoId),
},
viewer: {
type: GraphQLUser,
resolve: () => getViewer(),
},
},
mutateAndGetPayload: ({id, complete}) => {
const localTodoId = fromGlobalId(id).id;
changeTodoStatus(localTodoId, complete);
return {localTodoId};
},
});
继电器突变定义为here,如下所示:
this.props.relay.commitUpdate(
new ChangeTodoStatusMutation({
complete,
todo: this.props.todo,
viewer: this.props.viewer,
})
);
我很困惑schmea中的outputFileds从未在调用者中使用,并且看起来与中继中的胖查询无关。有谁能详细解释一下这个?
无论如何,我的最终目标是在grapahql / relay(如下所示)中实现身份验证,这需要获取在变异模式中定义的输出,但我不知道如何。
mutation {
createToken(username: String!, password: String!) {
token
error
}
}
答案 0 :(得分:1)
如果您想直接获取outputFields
,而不是使用它们来更新客户端商店,您可以定义onSuccess
函数并通过response
对象访问它们。
const onSuccess = response => {
if (response.createToken.error) {
console.log('Could not create token. Got error: ' + error);
} else {
// store response.createToken.token for future use.
}
};
this.props.relay.commitUpdate(
new CreateTokenMutation({username, password}),
{onSuccess}
);
在客户端变异实现,即CreateTokenMutation
,您必须指定outputFields
不是要更新客户端存储。因此,您将使用REQUIRED_CHILDREN
mutator配置。
class CreateTokenMutation extends Relay.Mutation {
getMutation() {
return Relay.QL`mutation {createToken}`;
}
getVariables() {
return {
username: this.props.username,
password: this.props.password,
};
}
getFatQuery() {
return Relay.QL`
fragment on CreateTokenPayload @relay(pattern: true) {
token,
error,
}
`;
}
getConfigs() {
return [{
type: REQUIRED_CHILDREN,
children: [
Relay.QL`
fragment on CreateTokenPayload {
token,
error,
}
`,
],
}];
}
}
要了解详情,请查看Relay documentation on mutation。