用于将变异提交到graphql-relay mutationWithClientMutationId的语法

时间:2016-01-28 19:39:57

标签: relayjs graphql graphql-js

我使用graphql-relay定义了一个GraphQL Mutation,但是在确定如何向其提交变异时遇到了问题。

以下是相关架构:

const userType = new GraphQLObjectType({
  name: 'User',
  description: 'user',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'The UUID for the user.',
      resolve(user) {
        return user.uuid;
      },
    },
  })
});

const registerUser = mutationWithClientMutationId({
  name: 'registerUser',
  inputFields: {
  },
  outputFields: {
    user: {
      type: userType,
      resolve: (payload) => {
        models.user.findById(payload.userId);
      }
    },
  },
  mutateAndGetPayload: (args) => {
    var newUser = models.user.build().save();
    return {
      userId: newUser.id,
    };
  }
});


const rootMutation = new GraphQLObjectType({
  name: 'RootMutationType',
  fields: {
    registerUser: registerUser,
  },
});

const schema = new GraphQLSchema({
  query: rootQuery,
  mutation: rootMutation,
});

HTTP调用应该注册新用户并返回userId?

谢谢!

2 个答案:

答案 0 :(得分:1)

我想指出,我发现你说你的变异不需要参数 - 它如何知道新用户的详细信息是什么?最终你可能需要一些关于该突变的参数。在第一个函数参数上,mutateAndGetPayload可以使用它们。 (我不是说每个突变都需要参数,但这个可能就是这样做了)

如果你正在使用Relay,关于如何使用来自Relay的突变,official document上有一些非常好的信息。特别是在底部,它显示各种变异器配置。如果您使用的是关联,则可能需要使用RANGE_ADD手动将此新帐户添加到中继存储中,否则,如果您要执行更广泛的重新审核,则可以使用FIELDS_CHANGE。你说在变异完成后你需要新的用户ID。如果您正在使用Relay,则可能需要查看REQUIRED_CHILDREN以指定无论Relay将构建的计算查询,您始终希望查询该ID。

您的变异输出是userType,因此您可以使用有效负载类型上的片段(可能是RegisterUserPayload)来访问它,它可能看起来像......

fragment on RegisterUserPayload {
  user {
    id
  }
}

现在,假设你正在使用Relay。如果您想通过GraphiQL手动尝试,那么您可以在GraphQL Mutation docs上使用如何进行突变的示例。有一个关于如何查询突变的直接示例。

最后,由于您自行询问如何以较低级别发出HTTP请求,因此您可以查看express-graphql文档,which explains如何查询。

答案 1 :(得分:0)

我发现了一种有效的突变格式:

mutation RootMutationType {
  registerUser(input:{clientMutationId:"123"}){
    clientMutationId, user { id }
  }
}