gpt4 book ai didi

graphql - GraphQLScalarType 中的 parseValue 和 parseLiteral 有什么区别

转载 作者:行者123 更新时间:2023-12-02 02:10:49 28 4
gpt4 key购买 nike

查看自定义标量类型的 GraphQL 文档(我正在尝试创建自己的日期类型),我不确定 parseValueparseLiteral 之间有什么区别是。

http://graphql.org/graphql-js/type/#graphqlscalartype

文档似乎没有包含任何关于函数应该做什么的描述。

有人可以告诉我有什么要求吗?我假设 serialize 必须将标量序列化为字符串。那是对的吗?我假设 parseLiteral 是该字符串到类型的反序列化?就我而言,是日期类型。然而,在示例中,serialize 和 parseValue 是相同的函数,这表明它不是一个简单的反序列化方法。

最佳答案

当类型的值将作为响应发送到客户端时,将调用 serialize 方法。由于输出的值采用 JSON 形式,因此 serialize 的返回值可以是任何值。可以是字符串、数字、数组、对象...

另外两个方法(parseValueparseLiteral)用于读取输入。

在 GraphQL 中,有两种从客户端读取输入的方法,一种是内联查询,例如:

query {
allUsers(first:10) {
id
}
}

其中 10first 参数的内联值。由于 GraphQL 的输入语言并不完全是 JSON,因此值(此处为 10)将被解析并转换为 AST(抽象语法树)。在这种情况下,parseLiteral 就派上用场了。它输入 AST 并返回该类型的解析值。类型可以像 JSON 一样复杂,并且 parseLiteral 可以遍历 AST 并返回 JSON。

从客户端读取输入的另一种方法是通过变量:

query ($howMany: YourCustomType) {
users(first: $howMany) {
id
}
}

变量:

{
"howMany": {
"thisMany": 10
}
}

由于变量是纯 JSON,所以这里不需要 AST,你已经有了 JSON。这就是 parseValue 发挥作用的地方。它获取 JSON 格式的输入并返回查询解析器应使用的任何内容。

function parseValue(value) {
let first = value.thisMany;
return first;
}

因此,从变量读取时与内联读取值时可能会有不同的表示,但从概念上讲,它们在表示方面应该是相同的。然而,由于输入的“类型”不同(内联是 GraphQL,变量是 JSON),解析算法可能不同。这就是为什么如果将其定义为输入类型,则需要提供两个单独的方法来读取它们。

关于graphql - GraphQLScalarType 中的 parseValue 和 parseLiteral 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55375003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com