向 graphql-relay mutationWithClientMutationId 提交突变的语法
Syntax for submitting a mutation to a graphql-relay mutationWithClientMutationId
我使用 graphql-relay 定义了一个 GraphQL Mutation,但在弄清楚如何向它提交一个 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,
});
注册新用户并取回用户 ID 的 HTTP 调用应该是什么样的?
谢谢!
我想指出,我看到你说你的变异不需要参数——它怎么知道新用户的详细信息是什么?最终,您可能需要有关该突变的一些参数。它们将在第一个函数参数上对您的 mutateAndGetPayload
可用。 (我并不是说每个突变都需要参数,但这个可能需要)
如果您使用的是 Relay,official document 上有一些关于如何使用来自 Relay 的突变的非常好的信息。特别是在底部,它显示了各种增变器配置。如果您正在使用连接,您可能需要使用 RANGE_ADD
手动将这个新帐户添加到中继存储,否则如果您想要执行更广泛的重新获取,您可以使用 FIELDS_CHANGE
。你说你在突变完成后需要新的用户 ID。如果您使用的是中继,您可能需要查看 REQUIRED_CHILDREN
以指定无论中继将构建的计算查询如何,您始终希望查询该 ID。
突变的输出是 userType
,因此您可以使用负载类型的片段访问它,可能是 RegisterUserPayload
,看起来像...
fragment on RegisterUserPayload {
user {
id
}
}
现在,假设您正在使用 Relay。如果您想通过 GraphiQL 手动尝试这个,那么您可以使用 GraphQL Mutation docs 上的示例,了解如何通过那里进行突变。有一个直接示例说明您如何查询您的突变。
最后,由于您询问了如何在自己发出 HTTP 请求的低级别执行此操作,为此您可以查看 express-graphql
文档,which explains 如何查询它。
我想出了一个有效的变异格式:
mutation RootMutationType {
registerUser(input:{clientMutationId:"123"}){
clientMutationId, user { id }
}
}
我使用 graphql-relay 定义了一个 GraphQL Mutation,但在弄清楚如何向它提交一个 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,
});
注册新用户并取回用户 ID 的 HTTP 调用应该是什么样的?
谢谢!
我想指出,我看到你说你的变异不需要参数——它怎么知道新用户的详细信息是什么?最终,您可能需要有关该突变的一些参数。它们将在第一个函数参数上对您的 mutateAndGetPayload
可用。 (我并不是说每个突变都需要参数,但这个可能需要)
如果您使用的是 Relay,official document 上有一些关于如何使用来自 Relay 的突变的非常好的信息。特别是在底部,它显示了各种增变器配置。如果您正在使用连接,您可能需要使用 RANGE_ADD
手动将这个新帐户添加到中继存储,否则如果您想要执行更广泛的重新获取,您可以使用 FIELDS_CHANGE
。你说你在突变完成后需要新的用户 ID。如果您使用的是中继,您可能需要查看 REQUIRED_CHILDREN
以指定无论中继将构建的计算查询如何,您始终希望查询该 ID。
突变的输出是 userType
,因此您可以使用负载类型的片段访问它,可能是 RegisterUserPayload
,看起来像...
fragment on RegisterUserPayload {
user {
id
}
}
现在,假设您正在使用 Relay。如果您想通过 GraphiQL 手动尝试这个,那么您可以使用 GraphQL Mutation docs 上的示例,了解如何通过那里进行突变。有一个直接示例说明您如何查询您的突变。
最后,由于您询问了如何在自己发出 HTTP 请求的低级别执行此操作,为此您可以查看 express-graphql
文档,which explains 如何查询它。
我想出了一个有效的变异格式:
mutation RootMutationType {
registerUser(input:{clientMutationId:"123"}){
clientMutationId, user { id }
}
}