reactjs - Apollo 错误处理 - 为什么反应应用程序崩溃?
问题描述
有人能解释一下,当我尝试使用返回错误的突变时,为什么我的 react app + apollo 会这样?
GraphQL 突变返回此(响应代码为 200):{"errors":[{"error":{"result":"identity.not-found","error":"authentication-failed","statusCode":401}}],"data":{"login":null}}
我的突变看起来像这样:
export const LOGIN_MUTATION = gql`
mutation($input: LoginInput!) {
login(input: $input) {
token
}
}
`;
称为:
const handleSignIn = () => {
loginMutation({
variables: {
input: {
clientId: config.clientId,
username: userName,
password: password,
clientSecret: config.clientSecret
}
}
});
};
它的行为有一段时间像预期的那样(我自己的自定义错误组件被渲染 - {error && <div>error</div>}
),但随后它抛出了这个未处理的拒绝。
如果我将 catch 回调添加到突变调用,它会按预期工作。
但是,我在 apollo 文档中没有找到任何关于需要始终以这种方式捕获 GraphQL 错误的内容。如果我理解正确,这应该足够了: const[loginMutation, {data, loading, error}] = useMutation(LOGIN_MUTATION);
这种行为是正确的还是我错过了什么?
版本:
"@apollo/react-hooks": "^3.1.3"
"apollo-boost": "^0.4.7"
"graphql": "^14.5.8"
解决方案
该mutate
函数返回一个 Promise,默认情况下,如果您的响应包含errors
对象或发生网络错误,该 Promise 将被拒绝。如果您将 更改errorPolicy
为ignore
或all
,则errors
响应中的 不会导致 Promise 拒绝,但网络错误仍然会。
onError
避免这种行为的唯一方法是通过参数提供错误处理程序。如果onError
提供,则返回的 Promisemutate
将始终解决,并且任何相关错误(取决于您的errorPolicy
)将被传递给onError
。
有关 Apollo 中错误处理的更多详细信息,请参见此处。可以在此处找到有关未处理的 Promise 拒绝的更多详细信息。
推荐阅读
- ios - NSString.boundingRect 在指定字体时失败,并显示“[NSNull renderingMode]: unrecognized selector sent to instance”
- java - 我不明白 System.out.println((char)b) 和 System.out.write((char)b) 之间的输出差异
- ruby-on-rails - Rails 5/rspec/capybara:如何为 AJAX 表单编写功能请求?
- c - 在阿姆斯壮数中没有得到想要的输出
- .net-core - 如何在 .NET Core 或 .NET Standard 中正确设置 Fody.Costura
- bdd - 如何在 Behave BDD 中处理这种背景案例
- postgresql - 从 sql 格式转储恢复 pythonanywhere 上的 postgresql
- python - 是否可以更改 Spacy 分词器的分词规则?
- javascript - 如何将ASCII码字符串转换为字符串?
- excel - 当标准单元格为空白时,我的自动过滤数据的 VBA 代码将保留以前的标准结果。我怎样才能让它返回所有数据呢?