1. ホーム
  2. graphql

GraphQLScalarTypeのparseValueとparseLiteralの違いは何ですか?

2023-08-15 05:10:38

質問

カスタムスカラー型に関するGraphQLドキュメントに目を通すと(私は独自の日付型を作成しようとしています)、次の違いがよくわかりません。 parseValueparseLiteral

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

ドキュメントには、関数が何をすることになっているのかの説明は含まれていないようです。

どなたか要件を教えていただけませんか? 私が想定しているのは serialize はスカラーを文字列にシリアライズしなければならないと仮定しています。 これは正しいのでしょうか? 私はparseLiteralがその文字列を型にデシリアライズしていると仮定しているのですが? 私の場合、Date型です。 しかし、例では - serialize と parseValue は同じ関数です - これは単純なデシリアライゼーションメソッドではないことを示唆しています。

どのように解決するのですか?

この serialize メソッドは、型の値がレスポンスとしてクライアントに送信されようとするときに呼び出されるでしょう。出力される値はJSONの形式なので、返り値として serialize の戻り値は何でもかまいません。文字列、数値、配列、オブジェクト......である。

他の二つのメソッド ( parseValueparseLiteral ) は入力を読み取るためのものです。

GraphQLでは、クライアントから入力を読み込む方法は2つあり、1つはクエリ内のインラインで、以下のようなものです。

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

ここで 10 はインラインの値で first 引数で指定します。GraphQLの入力言語は正確にはJSONではないので、その値(ここでは 10 )はパースされ、AST(Abstract Syntax Tree)に変換されます。この場合 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;
}

つまり、変数から読み込むときと、インラインで値を読み込むときとで、異なる表現になる可能性がありますが、概念的には同じ表現であるはずです。しかし、入力の "type" が異なるので(インラインは GraphQL、変数は JSON)、パースアルゴリズムが異なる可能性があります。そのため、入力型として定義する場合は、読み込むためのメソッドを2つ用意する必要があるのです。