GraphQLScalarTyp中parseValue和parseLiteral的区别是什么

2024-04-29 12:52:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: 函数字符串文档orghttp类型序列化js
1条回答
网友
1楼 · 发布于 2024-04-29 12:52:15

当类型的值将作为响应发送到客户端时,将调用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;
}

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

相关问题 更多 >