web-dev-qa-db-fra.com

quelle est la différence entre parseValue et parseLiteral dans GraphQLScalarType

En parcourant la documentation GraphQL pour les types scalaires personnalisés (j'essaie de créer mon propre type de date), je ne suis pas sûr de la différence entre parseValue et parseLiteral.

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

La documentation ne semble pas inclure de description de ce que les fonctions sont censées faire.

Quelqu'un peut-il me faire savoir quelles sont les exigences? Je suppose que serialize doit sérialiser le scalaire en une chaîne. Est-ce exact? Je suppose que parseLiteral est une désérialisation de cette chaîne au type? Dans mon cas, un type de date. Cependant, dans les exemples - serialize et parseValue sont la même fonction - ce qui suggère que ce n'est pas une méthode de désérialisation simple.

36
MonkeyBonkey

La méthode serialize serait appelée lorsque la valeur du type sera envoyée au client en réponse. Étant donné que les valeurs sur la sortie sont sous la forme de JSON, la valeur de retour de serialize peut être n'importe quoi. Peut être une chaîne, un nombre, un tableau, un objet ...

Les deux autres méthodes (parseValue et parseLiteral) consistent à lire l'entrée.

Dans GraphQL, il existe deux façons de lire les entrées du client, l'une est intégrée dans la requête, comme:

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

10 est la valeur en ligne pour l'argument first. Puisque la langue d'entrée pour GraphQL n'est pas exactement JSON, la valeur (ici 10) Est analysée et convertie en AST (arbre de syntaxe abstraite). Dans ce cas, parseLiteral vient jouer. Il entre le AST et retourne la valeur analysée du type. Les types peuvent être aussi complexes que JSON et parseLiteral peut traverser AST et renvoyer JSON.

L'autre façon de lire les entrées des clients consiste à utiliser des variables:

query ($howMany: YourCustomType) {
  users(first: $howMany) {
    id
  }
}

variables:

{
  "howMany": {
    "thisMany": 10
  }
}

Comme les variables sont du JSON pur, vous n'avez pas besoin de AST ici, vous avez déjà du JSON. C'est là que parseValue vient jouer. Il obtient l'entrée en JSON et retourne tout ce que le résolveur de requêtes doit utiliser.

function parseValue(value) {
    let first = value.thisMany;
    return first;
}

Ainsi, vous pourriez avoir une présentation différente lorsque vous lisez des variables que lorsque vous lisez des valeurs en ligne, mais conceptuellement, elles devraient être les mêmes en termes de présentation. Cependant, étant donné que le "type" d'entrée est différent (en ligne est GraphQL et variable est JSON), l'algorithme d'analyse peut être différent. C'est pourquoi si vous le définissez comme type d'entrée, vous devez fournir deux méthodes distinctes pour les lire.

64
Aᴍɪʀ