在relay中,如何获取graphql中定义的outputFilelds?

时间:2016-06-14 07:10:34

标签: graphql relay

我正在通过阅读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
  }
}

1 个答案:

答案 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