查看GraphQL文档中的自定义标量类型(我正在尝试创建自己的日期类型)我不确定parseValue
和parseLiteral
之间的区别。
http://graphql.org/graphql-js/type/#graphqlscalartype
文档似乎没有包含函数应该做什么的任何描述。
有人能让我知道要求是什么吗?我假设serialize
必须将标量序列化为字符串。那是对的吗?我假设parseLiteral是该字符串的反序列化类型?在我的例子中是一个日期类型。但是,在示例中 - serialize和parseValue是相同的函数 - 这表明它不是一个简单的反序列化方法。
答案 0 :(得分:54)
当要将类型的值作为响应发送到客户端时,将调用serialize
方法。由于输出上的值采用JSON格式,因此serialize
的返回值可以是任何值。可以是字符串,数字,数组,对象......
其他两种方法(parseValue
和parseLiteral
)用于读取输入。
在GraphQL中,有两种方法可以从客户端读取输入,一种是在查询中内联,如:
query {
allUsers(first:10) {
id
}
}
其中10
是first
参数的内联值。由于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),解析算法可能不同。这就是为什么如果将它定义为输入类型,则需要提供两个单独的方法来读取它们。