Was ist der Unterschied zwischen parseValue und parseLiteral in GraphQLScalarType?

8

Durch die GraphQL-Dokumentation nach benutzerdefinierten Skalartypen (ich versuche, meinen eigenen Datumstyp zu erstellen) bin ich nicht sicher, was der Unterschied zwischen parseValue und parseLiteral ist.

Ссылка

Die Dokumentation scheint keine Beschreibungen zu enthalten, was die Funktionen tun sollen.

Kann mir jemand sagen, was die Anforderungen sind? Ich nehme an, dass serialize den Skalar zu einer Zeichenfolge serialisieren muss. Ist das korrekt? Ich nehme an, dass parseLiteral eine Deserialisierung dieser Zeichenfolge zum Typ ist? In meinem Fall ein Datumstyp. In den Beispielen - serialize und parseValue sind jedoch dieselbe Funktion - was darauf hindeutet, dass es sich nicht um eine einfache Deserialisierungsmethode handelt.

    
MonkeyBonkey 06.01.2017, 17:21
quelle

1 Antwort

19

Die Methode serialize wird aufgerufen, wenn der Wert des Typs als Antwort an den Client gesendet wird. Da die Werte in der Ausgabe die Form von JSON haben, kann der Rückgabewert von serialize beliebig sein. Könnte String, Nummer, Array, Objekt sein ...

Die anderen beiden Methoden ( parseValue und parseLiteral ) sollen Eingaben lesen.

In GraphQL gibt es zwei Möglichkeiten, die Eingabe vom Client zu lesen, eine in der Abfrage, wie:

%Vor%

Dabei ist 10 der Inline-Wert für first argument. Da die Eingabesprache für GraphQL nicht genau JSON ist, wird der Wert (hier 10 ) analysiert und in AST (Abstract Source Tree) konvertiert. In diesem Fall kommt parseLiteral zum Spielen. Es gibt den AST ein und gibt den geparsten Wert des Typs zurück. Typen können so komplex sein wie JSON und parseLiteral könnte den AST durchlaufen und JSON zurückgeben.

Die andere Möglichkeit, Eingaben von Clients zu lesen, ist über Variablen:

%Vor%

Variablen:

%Vor%

Da die Variablen reines JSON sind, brauchen Sie hier keine AST, Sie haben bereits JSON. Hier kommt parseValue zum Einsatz. Es erhält die Eingabe als JSON und gibt zurück, was auch immer der Abfrage-Resolver verwenden sollte.

%Vor%

Sie könnten also eine andere Darstellung haben, wenn Sie von Variablen lesen, als wenn Sie Werte inline lesen, aber konzeptionell sollten sie hinsichtlich der Darstellung gleich sein. Da der "Typ" der Eingabe jedoch unterschiedlich ist (Inline ist GraphQL und Variable ist JSON), könnte der Parsing-Algorithmus anders sein. Wenn Sie es als Eingabetyp definieren, müssen Sie daher zwei separate Methoden zum Lesen bereitstellen.

    
Aᴍɪʀ 06.01.2017, 20:17
quelle

Tags und Links