无法检索 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.1localhost。我用我的本地 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 突变中发生的错误的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Hive 无法检索 Map

GraphQL 检索特定块的数据 - Gatsby + Wordpress

Amplify Flutter:如何连接到现有的 GraphQL 端点

[Gatsby][GraphQL]:从另一个查询中检索过滤器参数后运行查询

Flutter - 如何从 Firestore 中检索 ID 列表并在 GridView 中显示它们的项目?

使用 PHP 从数据库中检索图像并在 Flutter 项目中使用(在 Dart 中)