在GraphQL参数化查询中使用ID



我有以下模式:

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。传递给参数的任何变量也必须为非null。如果变量的类型是ID而不是ID!,我们告诉GraphQL该变量可能被省略或具有null值,这将与使用它的参数不兼容。

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

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

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

如果您明确表示$id是一个String,则需要将其更改为id,如下所示:

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

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

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

最新更新