GraphQLScalarTypeのparseValueとparseLiteralの違いは何ですか?
質問
カスタムスカラー型に関するGraphQLドキュメントに目を通すと(私は独自の日付型を作成しようとしています)、次の違いがよくわかりません。
parseValue
と
parseLiteral
は
http://graphql.org/graphql-js/type/#graphqlscalartype
ドキュメントには、関数が何をすることになっているのかの説明は含まれていないようです。
どなたか要件を教えていただけませんか? 私が想定しているのは
serialize
はスカラーを文字列にシリアライズしなければならないと仮定しています。 これは正しいのでしょうか? 私はparseLiteralがその文字列を型にデシリアライズしていると仮定しているのですが? 私の場合、Date型です。 しかし、例では - serialize と parseValue は同じ関数です - これは単純なデシリアライゼーションメソッドではないことを示唆しています。
どのように解決するのですか?
この
serialize
メソッドは、型の値がレスポンスとしてクライアントに送信されようとするときに呼び出されるでしょう。出力される値はJSONの形式なので、返り値として
serialize
の戻り値は何でもかまいません。文字列、数値、配列、オブジェクト......である。
他の二つのメソッド (
parseValue
と
parseLiteral
) は入力を読み取るためのものです。
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つ用意する必要があるのです。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン