在 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
,那么 ID
或 ID!
变量都是有效的。
如果其他人正在寻找答案,下面是几个如何在 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 是字符串类型,因此出现错误。
我有以下架构:
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
,那么 ID
或 ID!
变量都是有效的。
如果其他人正在寻找答案,下面是几个如何在 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 是字符串类型,因此出现错误。