【问题标题】:Using ID in GraphQL parametrized query在 GraphQL 参数化查询中使用 ID
【发布时间】:2020-06-23 09:10:23
【问题描述】:

我有以下架构:

type Post {
  id: ID!
  text: String
}

我正在使用来自 neo4j-graphql.js 的自动生成突变,因此我可以访问以下突变:

UpdatePost(
id: ID!
text: String
): Post

问题:

当我使用以下查询时:

mutation update($id: String, $text: String) {
  UpdatePost(id: $id, text: $text) {
    id
    text
  }
}

带有以下参数:

{
  "id": "a19289b3-a191-46e2-9912-5a3d1b067cb2",
  "text": "text"
}

我收到以下错误:

{
  "error": {
    "errors": [
      {
        "message": "Variable \"$id\" of type \"String\" used in position expecting type \"ID!\".",
        "locations": [
          {
            "line": 1,
            "column": 17
          },
          {
            "line": 2,
            "column": 18
          }
        ],
        "extensions": {
          "code": "GRAPHQL_VALIDATION_FAILED"
        }
      }
    ]
  }
}

有没有办法将我的字符串 ID 转换为实际的 ID 类型?或者完全规避这个错误?

【问题讨论】:

  • 将突变定义调整为mutation update($id: ID!

标签: graphql apollo grandstack


【解决方案1】:

您看到的错误与查询的变量定义中指定的变量类型有关。它与变量的值无关(看起来是正确的)。根据错误消息,$id 变量的类型是 String,而不是您粘贴的查询中显示的 ID

不管怎样,因为id 参数的类型(使用$id 变量)是ID!,而不是ID,那么你的变量的类型也应该是ID!

! 表示非空(必需)类型。换句话说,必须始终提供id 参数,并且不能为其赋予值null。传递参数的任何变量也必须是非空的。如果变量的类型是 ID 而不是 ID!,我们告诉 GraphQL 变量可能被省略或具有 null 值,这将与使用它的参数不兼容。

请注意,相反的情况并非如此:如果参数的类型是ID,那么IDID! 变量将是有效的。

【讨论】:

  • 我明白了,但是你怎么把这样的字符串变成一个ID呢?我使用查询字段时返回的确切值。
  • 您不会将字符串“转换”为 ID。 ID 标量仅接受字符串(和整数)作为spec 中所述的有效值。
  • 如果您在修复变量定义后仍然看到错误,请重新检查它是否实际上是相同的错误。您粘贴的错误与您粘贴的查询不匹配。
  • 错误信息确实如此。我已经从架构中清除了不相关的字段。 > 如果您在修复变量定义后仍然看到错误 这正是我的问题的重点……如何修复变量定义?我的问题中的值正是查询我要修改的对象时返回的值。
  • 当我不使用参数化查询时,这没有问题
【解决方案2】:

如果其他人正在寻找答案,这里有几个如何在 C# 中使用 ID 变量的示例:

var request = new GraphQLRequest
            {
                Query = @"
                query getToken($tokenId: ID!){{
                    tokens(where: {{ id: $tokenId}} orderBy: decimals, orderDirection: desc) {{
                        id
                        symbol
                        name
                      }}
                }}", Variables = new
                {
                    tokenId = "<stringValue>"
                }
            };

对于使用列表:

query getToken($tokenIds: [ID!]){{
                    tokens(where: {{ id_in: $tokenIds}} orderBy: decimals, orderDirection: desc) {{
                        id
                        symbol
                        name
                      }}
                }}", Variables = new 
                {
                    tokenIds = new ArrayList(<yourStringArrayListValue>)
                }

【讨论】:

    【解决方案3】:

    对于遇到此问题的任何其他人,在您的突变定义中:

    mutation update($id: String, $text: String) {
      UpdatePost(id: $id, text: $text) {
        id
        text
      }
    }
    

    如果您明确说 $id 是一个字符串,您需要将其更改为 ID,如下所示:

    mutation update($id: ID, $text: String) {
      UpdatePost(id: $id, text: $text) {
        id
        text
      }
    }
    

    这就是您看到错误的原因,因为您更新它的查询明确表示 ID 是一个字符串类型,因此出现错误。

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2020-11-28
      • 2023-02-07
      • 2018-08-12
      • 2020-11-20
      • 2020-11-16
      • 1970-01-01
      • 2019-06-06
      • 2021-01-11
      相关资源
      最近更新 更多