3

我有以下架构:

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

4

3 回答 3

4

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

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

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

请注意,相反的情况是不正确的:如果参数的类型是ID,那么 anIDID!变量将是有效的。

于 2020-03-11T13:12:37.247 回答
0

如果其他人正在寻找答案,这里有几个如何在 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>)
                }
于 2021-01-15T09:03:48.250 回答
0

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

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

于 2021-08-08T14:44:21.770 回答