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.