typedefs type tools now mutations data graphql graphql-js

tools - graphql typedefs



¿Cuál es la diferencia entre parseValue y parseLiteral en GraphQLScalarType (1)

El método de serialize se llamará cuando el valor del tipo se envíe al cliente como respuesta. Dado que los valores en la salida están en la forma de JSON, el valor de retorno de serialize podría ser cualquier cosa. Podría ser cadena, número, matriz, objeto ...

Los otros dos métodos ( parseValue y parseLiteral ) son leer la entrada.

En GraphQL hay dos formas de leer la entrada del cliente, una está en línea en la consulta, como:

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

donde 10 es el valor en línea para el first argumento. Como el idioma de entrada de GraphQL no es exactamente JSON, el valor (aquí 10 ) se analiza y se convierte a AST (árbol de sintaxis abstracta). En este caso, parseLiteral viene a jugar. Ingresa el AST y devuelve el valor analizado del tipo. Los tipos podrían ser tan complejos como JSON y parseLiteral podrían atravesar el AST y devolver JSON.

La otra forma de leer la entrada de los clientes es a través de variables:

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

variables:

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

Como las variables son JSON puras, no necesita AST aquí, ya tiene JSON. Ahí es donde parseValue viene a jugar. Obtiene la entrada como JSON y devuelve lo que debe utilizar el programa de resolución de consultas.

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

Por lo tanto, podría tener una presentación diferente cuando lee de variables que cuando lee valores en línea, pero conceptualmente, deberían ser iguales en términos de presentación. Sin embargo, como el "tipo" de entrada es diferente (en línea es GraphQL y la variable es JSON), el algoritmo de análisis podría ser diferente. Es por eso que si lo define como tipo de entrada, debe proporcionar dos métodos separados para leerlos.

Revisando la documentación de GraphQL para tipos escalares personalizados (estoy intentando crear mi propio tipo de fecha) No estoy seguro de cuál es la diferencia entre parseValue y parseLiteral .

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

La documentación no parece incluir ninguna descripción de lo que se supone que deben hacer las funciones.

¿Alguien puede decirme cuáles son los requisitos? Supongo que la serialize debe serializar el escalar a una cadena. ¿Es eso correcto? ¿Asumo que parseLiteral es una deserialización de esa cadena al tipo? En mi caso un tipo de fecha. Sin embargo, en los ejemplos, serialize y parseValue son la misma función, lo que sugiere que no es un simple método de deserialización.