web-dev-qa-db-ja.com

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

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

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

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

誰かが要件を教えてもらえますか? serializeは、スカラーを文字列にシリアル化する必要があると仮定しています。あれは正しいですか? parseLiteralはその文字列を型に逆シリアル化すると仮定していますか?私の場合、日付型。ただし、例では、serializeとparseValueは同じ関数です。これは、単純な逆シリアル化メソッドではないことを示しています。

36
MonkeyBonkey

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

他の2つのメソッド(parseValueおよびparseLiteral)は、入力を読み取ることです。

GraphQLには、クライアントからの入力を読み取る2つの方法があります。1つは、クエリ内でのインラインです。

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

ここで、10first引数のインライン値です。 GraphQLの入力言語は正確にJSONではないため、値(ここでは10)は解析され、AST(Abstract Syntax Tree)に変換されます。この場合、parseLiteralが再生されます。 ASTを入力し、解析された型の値を返します。型はJSONと同じくらい複雑で、parseLiteralはASTを通過してJSONを返すことができます。

クライアントから入力を読み取るもう1つの方法は、変数を使用することです。

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)、解析アルゴリズムは異なる可能性があります。そのため、入力タイプとして定義する場合、それらを読み取るために2つの個別のメソッドを提供する必要があります。

64
Aᴍɪʀ