Solucionadores de pruebas y depuración en AWS AppSync (JavaScript) - AWS AppSync GraphQL

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Solucionadores de pruebas y depuración en AWS AppSync (JavaScript)

AWS AppSync ejecuta solucionadores en un campo de GraphQL con respecto a un origen de datos. Cuando se trabaja con solucionadores de canalizaciones, las funciones interactúan con los orígenes de datos. Tal y como se explica en JavaScript resolvers overview, las funciones se comunican con los orígenes de datos mediante controladores de solicitudes y respuestas escritos en JavaScript y que se ejecutan en el tiempo de ejecución APPSYNC_JS. Esto le permite proporcionar lógica y condiciones personalizadas antes y después de comunicarse con el origen de datos.

A fin de ayudar a los desarrolladores a escribir, probar y depurar estos solucionadores, la consola de AWS AppSync también proporciona herramientas para crear una solicitud y una respuesta de GraphQL con datos simulados, incluso hasta llegar al solucionador de cada campo individual. Además, puede realizar consultas, mutaciones y suscripciones en la consola de AWS AppSync y ver un flujo de registro detallado de toda la solicitud desde Amazon CloudWatch. Esto incluye los resultados del origen de datos.

Prueba con datos simulados

Cuando se invoca a un solucionador de GraphQL, este contiene un objeto context que incluye información útil sobre la solicitud. Por ejemplo, contiene los argumentos de un cliente, información de identidad y datos del campo principal de GraphQL. También almacena los resultados del origen de datos, que puede usar en el controlador de respuestas. Si desea más información acerca de esta estructura y las utilidades auxiliares disponibles para programar, consulte Resolver context object reference.

Al escribir o editar una función de solucionador, puede pasar un objeto simulado o de contexto de prueba al editor de la consola. Esto le permite ver cómo se evalúan los controladores de solicitudes y de respuestas sin que se utilice en realidad ningún origen de datos. Por ejemplo, puede transferir un argumento firstname: Shaggy de prueba y ver cómo se evalúa cuando utiliza ctx.args.firstname en el código de la plantilla. También puede probar la evaluación de cualquier utilidad auxiliar, como util.autoId() o util.time.nowISO8601().

Prueba de solucionadores

En este ejemplo, se utilizará la consola de AWS AppSync para probar los solucionadores.

  1. Inicie sesión en la AWS Management Console y abra la consola de AppSync.

    1. En el panel de API, seleccione su API de GraphQL.

    2. En la barra lateral, seleccione Funciones.

  2. Seleccione una función existente.

  3. En la parte superior de la página Actualizar función, seleccione Seleccionar contexto de prueba y, a continuación, Crear nuevo contexto.

  4. Seleccione un objeto de contexto de ejemplo o rellene el JSON manualmente en la ventana Configurar contexto de prueba que aparece a continuación.

  5. Introduzca un Nombre de contexto de texto.

  6. Seleccione el botón Guardar.

  7. Para evaluar el solucionador con el objeto de contexto simulado, elija Run Test (Ejecutar prueba).

Veamos un ejemplo más práctico. Imagine que tiene una aplicación que almacena un tipo de GraphQL llamado Dog, que genera automáticamente un identificador para los objetos y los almacena en Amazon DynamoDB. También desea escribir algunos valores tomándolos de los argumentos de una mutación de GraphQL y permitir que solo determinados usuarios vean la respuesta. En el siguiente fragmento de código se muestra el aspecto que podría tener el esquema:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

Puede escribir una función de AWS AppSync y añadirla a su solucionador de addDog para gestionar la mutación. Para probar la función de AWS AppSync, puede rellenar un objeto de contexto como en el siguiente ejemplo. Se incluyen argumentos del cliente como name y age, así como un username rellenado en el objeto identity:

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

Puede probar la función de AWS AppSync mediante el siguiente código:

import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id: util.autoId() }), attributeValues: util.dynamodb.toMapValues(ctx.args), }; } export function response(ctx) { if (ctx.identity.username === 'Nadia') { console.log("This request is allowed") return ctx.result; } util.unauthorized(); }

El controlador de solicitudes y respuestas evaluado tiene los datos de su objeto de contexto de prueba y el valor generado de util.autoId(). Además, si cambia el username por un valor distinto de Nadia, no se devolverán resultados, porque la comprobación de autorización daría error. Para obtener más información acerca del control de acceso preciso, consulte Casos de uso de autorizaciones.

Prueba de los controladores de solicitudes y respuestas con las API de AWS AppSync

Puede usar el comando de API EvaluateCode para probar el código de forma remota con datos simulados. Para empezar a usar el comando, asegúrese de haber añadido el permiso appsync:evaluateMappingCode a su política. Por ejemplo:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateCode", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

Puede utilizar el comando mediante la AWS CLI o los SDK de AWS. Tomemos como ejemplo el esquema Dog y sus controladores de solicitudes y respuestas de la función AWS AppSync de la sección anterior. Con la CLI de la estación local, guarde el código en un archivo denominado code.js y, a continuación, guarde el objeto context en un archivo denominado context.json. Ejecute el siguiente comando desde el intérprete de comandos:

$ aws appsync evaluate-code \ --code file://code.js \ --function response \ --context file://context.json \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0

La respuesta contiene un evaluationResult que incluye la carga útil devuelta por el controlador. También contiene un objeto logs que incluye la lista de registros generados por el controlador durante la evaluación. Esto facilita la depuración de la ejecución de código y la consulta de información sobre la evaluación como ayuda para solucionar problemas. Por ejemplo:

{ "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}", "logs": [ "INFO - code.js:13:5: \"This request is allowed\"" ] }

El evaluationResult se puede analizar como JSON, lo que da como resultado:

{ "breed": "Miniature Schnauzer", "color": "black_grey" }

Cuando se utiliza el SDK, puede incorporar fácilmente pruebas de su conjunto de pruebas favorito para validar el comportamiento de los controladores. Recomendamos crear pruebas con el marco de pruebas Jest, pero cualquier conjunto de pruebas funciona. En el siguiente fragmento de código se muestra una ejecución de validación hipotética. Tenga en cuenta que esperamos que la respuesta de la evaluación sea un JSON válido, por lo que utilizamos JSON.parse para recuperar el JSON de la respuesta de cadena:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0') test('request correctly calls DynamoDB', async () => { const code = fs.readFileSync('./code.js', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

Esto produce el siguiente resultado:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 totalTime: 1.511 s, estimated 2 s

Depuración de una consulta en tiempo real

No hay nada que pueda reemplazar a una prueba de extremo a extremo y el registro para depurar una aplicación de producción. AWS AppSync permite registrar los errores y todos los detalles de cada solicitud mediante Amazon CloudWatch. Además, puede utilizar la consola de AWS AppSync para probar las consultas, mutaciones y suscripciones de GraphQL y enviar los datos de registro de cada solicitud al editor de consultas para depurarlas en tiempo real. Para las suscripciones, los registros muestran la información del tiempo de conexión.

Para ello, debe haber habilitado previamente los registros de Amazon CloudWatch como se describe en Monitoreo y registro. A continuación, en la consola de AWS AppSync, elija la pestaña Consultas y escriba en una consulta de GraphQL válida. En la sección inferior derecha, haga clic y arrastre la ventana Registros para abrir la vista de registros. Utilice el icono de flecha de reproducción de la parte superior de la página para ejecutar la consulta de GraphQL. Al cabo de un momento, los registros completos de la solicitud y la respuesta de la operación se enviarán a esta sección y podrá verlos en la consola.