GraphQLScalarType中parseValue和parseLiteral之间的区别是什么

Mon*_*key 42 graphql graphql-js

翻翻GraphQL文件自定义标量类型(我想创建自己的日期类型),我不知道有什么区别parseValueparseLiteral是.

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

该文档似乎没有包含函数应该执行的任何描述.

有人能让我知道要求是什么吗?我假设serialize必须将标量序列化为字符串.那是对的吗?我假设parseLiteral是该字符串的反序列化类型?在我的例子中是一个日期类型.但是,在示例中 - serialize和parseValue是相同的函数 - 这表明它不是一个简单的反序列化方法.

Aᴍɪ*_*ᴍɪʀ 71

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

另外两种方法(parseValueparseLiteral)是读取输入.

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

query {
    allUsers(first:10) {
        id
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

query ($howMany: YourCustomType) {
  users(first: $howMany) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

变量:

{
  "howMany": {
    "thisMany": 10
  }
}
Run Code Online (Sandbox Code Playgroud)

由于变量是纯JSON,因此您不需要AST,您已经拥有JSON.这就是parseValue发挥作用的地方.它将输入作为JSON获取并返回查询解析器应使用的任何内容.

function parseValue(value) {
    let first = value.thisMany;
    return first;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @thisdotvoid说实话我不记得了,我想我读了源代码,因为我感兴趣!你可以在这里找到一些好东西:http://graphql.org/graphql-js/type/ (3认同)
  • 您会分享您从哪里获得这些信息吗? (2认同)
  • 我读过的很棒的解释!非常感谢您的发现 (2认同)