GraphQLScalarType 中的 parseValue 和 parseLiteral 有什么区别
what's the difference between parseValue and parseLiteral in GraphQLScalarType
查看自定义标量类型的 GraphQL 文档(我正在尝试创建自己的日期类型)我不确定 parseValue
和 parseLiteral
之间有什么区别。
http://graphql.org/graphql-js/type/#graphqlscalartype
该文档似乎没有包含任何函数应该做什么的描述。
有人可以告诉我要求是什么吗?我假设 serialize
必须将标量序列化为字符串。那是对的吗?我假设 parseLiteral 是将该字符串反序列化为类型?在我的例子中是 Date 类型。但是,在示例中 - serialize 和 parseValue 是相同的函数 - 这表明它不是简单的反序列化方法。
当类型的值将作为响应发送到客户端时,将调用 serialize
方法。由于输出值的形式为 JSON,因此 serialize
的 return 值可以是任何值。可以是字符串、数字、数组、对象...
其他两种方法(parseValue
和parseLiteral
)是读取输入。
在 GraphQL 中有两种读取客户端输入的方法,一种是在查询中内联,例如:
query {
allUsers(first:10) {
id
}
}
其中 10
是 first
参数的内联值。由于 GraphQL 的输入语言不完全是 JSON,值(此处 10
)正在被解析并转换为 AST(抽象语法树)。在这种情况下,parseLiteral
开始发挥作用。它输入 AST 和 returns 类型的解析值。类型可以像 JSON 和 parseLiteral
一样复杂,可以遍历 AST 和 return JSON.
从客户端读取输入的另一种方法是通过变量:
query ($howMany: YourCustomType) {
users(first: $howMany) {
id
}
}
变量:
{
"howMany": {
"thisMany": 10
}
}
因为变量是纯的JSON,你在这里不需要AST,你已经有了JSON。这就是 parseValue
发挥作用的地方。无论查询解析器应使用什么,它都会将输入作为 JSON 和 returns。
function parseValue(value) {
let first = value.thisMany;
return first;
}
因此,当您从变量中读取时和您读取内联值时可能会有不同的表示,但从概念上讲,它们在表示方面应该是相同的。然而,由于输入的 "type" 不同(内联是 GraphQL,变量是 JSON),解析算法可能不同。这就是为什么如果将其定义为输入类型,则需要提供两个单独的方法来读取它们。
查看自定义标量类型的 GraphQL 文档(我正在尝试创建自己的日期类型)我不确定 parseValue
和 parseLiteral
之间有什么区别。
http://graphql.org/graphql-js/type/#graphqlscalartype
该文档似乎没有包含任何函数应该做什么的描述。
有人可以告诉我要求是什么吗?我假设 serialize
必须将标量序列化为字符串。那是对的吗?我假设 parseLiteral 是将该字符串反序列化为类型?在我的例子中是 Date 类型。但是,在示例中 - serialize 和 parseValue 是相同的函数 - 这表明它不是简单的反序列化方法。
当类型的值将作为响应发送到客户端时,将调用 serialize
方法。由于输出值的形式为 JSON,因此 serialize
的 return 值可以是任何值。可以是字符串、数字、数组、对象...
其他两种方法(parseValue
和parseLiteral
)是读取输入。
在 GraphQL 中有两种读取客户端输入的方法,一种是在查询中内联,例如:
query {
allUsers(first:10) {
id
}
}
其中 10
是 first
参数的内联值。由于 GraphQL 的输入语言不完全是 JSON,值(此处 10
)正在被解析并转换为 AST(抽象语法树)。在这种情况下,parseLiteral
开始发挥作用。它输入 AST 和 returns 类型的解析值。类型可以像 JSON 和 parseLiteral
一样复杂,可以遍历 AST 和 return JSON.
从客户端读取输入的另一种方法是通过变量:
query ($howMany: YourCustomType) {
users(first: $howMany) {
id
}
}
变量:
{
"howMany": {
"thisMany": 10
}
}
因为变量是纯的JSON,你在这里不需要AST,你已经有了JSON。这就是 parseValue
发挥作用的地方。无论查询解析器应使用什么,它都会将输入作为 JSON 和 returns。
function parseValue(value) {
let first = value.thisMany;
return first;
}
因此,当您从变量中读取时和您读取内联值时可能会有不同的表示,但从概念上讲,它们在表示方面应该是相同的。然而,由于输入的 "type" 不同(内联是 GraphQL,变量是 JSON),解析算法可能不同。这就是为什么如果将其定义为输入类型,则需要提供两个单独的方法来读取它们。