我在服务器上使用GraphQL和mongoose。
当发生验证错误时,GraphQL突变发送状态代码为200的响应。在客户端,响应如下所示:
{
"data": null,
"errors": [{
"message": "error for id...",
"path": "_id"
}]
}
我想使用阿波罗客户端突变promise的catch
功能访问验证错误。类似:
this.props.deleteProduct(this.state.selectedProductId).then(response => {
// handle successful mutation
}).catch(response => {
const errors = response.errors; // does not work
this.setState({ errorMessages: errors.map(error => error.message) });
});
如何做到这一点?
使用graphql标记符号,您可以访问错误:
<Mutation mutation={UPDATE_TODO} key={id}>
{(updateTodo, { loading, error }) => (
<div>
<p>{type}</p>
<form
onSubmit={e => {
e.preventDefault();
updateTodo({ variables: { id, type: input.value } });
input.value = "";
}}
>
<input
ref={node => {
input = node;
}}
/>
<button type="submit">Update Todo</button>
</form>
{loading && <p>Loading...</p>}
{error && <p>Error :( Please try again</p>}
</div>
)}
</Mutation>
https://www.apollographql.com/docs/react/essentials/mutations.html
注意:这个答案(可以说是整个问题)现在已经过时了,因为在阿波罗客户端的最新版本中,突变错误出现在catch中。
突变中的GraphQL错误目前显示在和
内响应的错误
字段中。我认为肯定有人声称它们应该出现在catch
中,但这是GitHunt突变的片段:
// The container
const withData = graphql(SUBMIT_REPOSITORY_MUTATION, {
props: ({ mutate }) => ({
submit: repoFullName => mutate({
variables: { repoFullName },
}),
}),
});
// Where it's called
return submit(repoFullName).then((res) => {
if (!res.errors) {
browserHistory.push('/feed/new');
} else {
this.setState({ errors: res.errors });
}
});
之前来自@stuailo的答案似乎并没有涵盖所有用例。如果我在服务器端代码上抛出错误,响应代码将不同于200,并且错误将使用. catch()
处理,而不是使用. then()
。
链接到GitHub上的问题。
最好的方法可能是处理两个上的错误。然后()
和。catch()
。
const { deleteProduct } = this.props;
const { selectedProductId } = this.state;
deleteProduct(selectedProductId)
.then(res => {
if (!res.errors) {
// handle success
} else {
// handle errors with status code 200
}
})
.catch(e => {
// GraphQL errors can be extracted here
if (e.graphQLErrors) {
// reduce to get message
_.reduce(
e.graphQLErrors,
(res, err) => [...res, error.message],
[]
);
}
})
我有以下代码,我正在尝试决定如何处理错误: 服务器发回一个GraphQL错误对象,并将其发回,使其出现在突变的块中。如果变异成功,组件的数据将使用参数更新,但我看不到处理错误的等价方法。 理想情况下,我希望更新块中的Apollo缓存,但在这一点上,我甚至不能向组件或状态注入道具。 最终的结果是在Register组件上设置一个prop/state,它显示了一个带有条件呈现的错误消息组件。一种方法可以
在后端,我进行了调试,并收到了请求,它根据客户机上设置的令牌查找用户,但随后什么也不做,只在我试图从应用程序发送时返回给我400,在graphiql浏览器上。 我错过了什么?非常感谢。
我目前使用vue-apollo包为Apollo客户机,使用VueJs堆栈,使用django和graphene-python为我的GraphQl API。 下面是vue-apollo的一个简单设置: 返回以下错误响应: 然而,在我的vue应用程序中,常规查询可以很好地解决正确的响应,除了突变,所以这让我真的很困惑
我正在为Angular练习&。 我在从客户端创建查询时遇到了问题。 我已经成功地在后端创建了graphql查询。 无法找到解决方案答案。请帮忙。
我在web服务器上使用apollo客户端与graphql服务器(也是apollo)通信。我有一个成功的查询,可以正常工作和检索数据,但当我尝试变异时,我会收到新的Apollo错误消息。复制/粘贴到graphiql中的相同突变非常有效。 我已经检查了graphql服务器上的CORS,它已启用并正常运行。我已经将代码中的变体复制并粘贴到graphiql编辑器中,它按预期工作。 有人能为我解释一下吗,或
问题内容: 我在状态中存储了一堆信息,我需要使用变异将其传递到我的graphQL服务器,但是在调用下一个变异之前,我需要使用每个变异的结果,因为我需要: 在数据库中创建一个新对象 使用为该对象生成的ID创建另一个对象 修改原始对象以存储第二个对象生成的ID 我注意到apollo Mutation组件具有onCompleted回调,但是我不知道如何使用此回调来触发另一个突变,或者这是否是解决我的问题