无法检索 Flutter 项目中 Graphql 突变中发生的错误
Posted
技术标签:
【中文标题】无法检索 Flutter 项目中 Graphql 突变中发生的错误【英文标题】:Unable to retrieve errors occured in Graphql mutation in flutter project 【发布时间】:2020-10-11 13:03:10 【问题描述】:我在我的 Flutter 应用程序中使用包 graphql_flutter 进行 GraphQL 操作。查询和突变进展顺利,但我无法按照他们文档中提到的方式检索错误。每次我收到一般错误消息时,
ClientException: Failed to connect to http://127.0.0.1:3006/graphql:
我做得到,
print(result.exception.toString());
我的变异看起来像,
final MutationOptions mutationOptions = MutationOptions(
documentNode: gql(mutationString),
variables: vars
);
final QueryResult result = await _instance._client.mutate(mutationOptions);
if (result.hasException)
// none of the following prints the expected error.
print(result.exception.clientException.message);
print(result.exception.graphqlErrors);
print(result.exception.toString());
print(result.data);
return result.data;
而在 apollo 客户端中,我的错误是:
"errors": [
"message": "Invalid Phone number provided",
"locations": [
"line": 2,
"column": 3
],
"path": [
"otp"
],
"extensions":
"code": "INTERNAL_SERVER_ERROR",
....
但我什么都不懂。
注意:成功响应按预期进行。我想知道如何获取 graphql 错误。
【问题讨论】:
【参考方案1】:我发现了问题。这是因为android无法从模拟器连接到127.0.0.1
或localhost
。我用我的本地 IP 地址替换了主机,现在它工作正常。
【讨论】:
【参考方案2】:把它放在一个try/catch块中,看看它是否能捕捉到任何异常
final QueryResult result = await _instance._client.mutate(mutationOptions);
【讨论】:
在那一行之后我可以打印 result.exception ,所以很明显 _client.mutate 调用没有异常。它已经在该函数内部进行了处理。 那么错误应该在结果数据内部而不是结果异常。例外仅适用于语法和网络相关问题。不是中间件抛出的异常。 你应该手动检查这些错误,比如 result.data["errors"] != null or somethng result.data 打印 null,并且“例外仅针对语法和网络相关问题” - 在文档中的任何地方都没有发现,我按照文档中提到的方式进行了操作。 不应该。 GraphQL 为所有结果返回状态码 200。这是 GraphQL 服务器的事情。您必须手动检查结果是实际数据还是错误。【参考方案3】:最初的问题是如何获取 graphql 错误。 我正在使用 graphql:^5.0.0
我检查了文档并找到了这个例子:
if (result.hasException)
if (result.exception.linkException is NetworkException)
// handle network issues, maybe
return Text(result.exception.toString())
但这只是给了我异常,而不是错误,我将结果异常转换为错误类型并且能够得到消息:
if (result.hasException)
if (result.exception!.linkException is ServerException)
ServerException exception =
result.exception!.linkException as ServerException;
var errorMessage = exception.parsedResponse!.errors![0].message;
print(errorMessage);
throw Exception(errorMessage);
对于一个简单的消息来说,这似乎需要很多工作,我想知道是否有另一种更简单的内置方法来做到这一点
【讨论】:
以上是关于无法检索 Flutter 项目中 Graphql 突变中发生的错误的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 检索特定块的数据 - Gatsby + Wordpress
Amplify Flutter:如何连接到现有的 GraphQL 端点
[Gatsby][GraphQL]:从另一个查询中检索过滤器参数后运行查询