在 GraphQL 参数化查询中使用 ID

Using ID in GraphQL parametrized query

我有以下架构:

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 类型?或者完全避免这个错误?

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

无论如何,因为 id 参数(使用 $id 变量的地方)的类型是 ID!,而不是 ID,那么你的变量类型应该也可以是 ID!.

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

请注意,反之则不然:如果参数的类型是 ID,那么 IDID! 变量都是有效的。

如果其他人正在寻找答案,下面是几个如何在 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>)
                }

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

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 是字符串类型,因此出现错误。