Apollo 客户端突变错误处理
Apollo client mutation error handling
我在服务器上使用 GraphQL 和猫鼬。
当发生验证错误时,GraphQL 突变会发送状态代码为 200 的响应。在客户端,响应如下所示:
{
"data": null,
"errors": [{
"message": "error for id...",
"path": "_id"
}]
}
我想使用 apollo-client 突变承诺的 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) });
});
如何做到这一点?
注意:这个答案(可以说是整个问题)现在已经过时了,因为突变错误出现在 catch
中的更新版本的 Apollo Client 中。
变异导致的 GraphQL 错误当前显示在 then
内响应的 errors
字段中。我认为肯定有人声称它们应该出现在 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 });
}
});
@stubailo 之前的回答似乎没有涵盖所有用例。如果我在服务器端代码上抛出错误,响应代码将不同于 200,并且将使用 .catch()
而不是 .then()
.
处理错误
Link 到 GitHub 上的问题。
最好的办法可能是同时处理 .then()
和 .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 标记符号,您可以访问错误:
<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
我在服务器上使用 GraphQL 和猫鼬。
当发生验证错误时,GraphQL 突变会发送状态代码为 200 的响应。在客户端,响应如下所示:
{
"data": null,
"errors": [{
"message": "error for id...",
"path": "_id"
}]
}
我想使用 apollo-client 突变承诺的 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) });
});
如何做到这一点?
注意:这个答案(可以说是整个问题)现在已经过时了,因为突变错误出现在 catch
中的更新版本的 Apollo Client 中。
变异导致的 GraphQL 错误当前显示在 then
内响应的 errors
字段中。我认为肯定有人声称它们应该出现在 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 });
}
});
@stubailo 之前的回答似乎没有涵盖所有用例。如果我在服务器端代码上抛出错误,响应代码将不同于 200,并且将使用 .catch()
而不是 .then()
.
Link 到 GitHub 上的问题。
最好的办法可能是同时处理 .then()
和 .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 标记符号,您可以访问错误:
<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