Ejemplo de solucionador de canalización con Amazon DynamoDB
Supongamos que desea asociar un solucionador de canalización a un campo llamado getPost(id:ID!)
que devuelve un tipo Post
de un origen de datos de Amazon DynamoDB con la consulta de GraphQL siguiente:
getPost(id:1){ id title content }
En primer lugar, adjunte un solucionador sencillo a Query.getPost
con el siguiente código. Este es un ejemplo de código de solucionador sencillo. No hay ninguna lógica definida en el controlador de solicitudes, y el controlador de respuestas simplemente devuelve el resultado de la última función.
/** * Invoked **before** the request handler of the first AppSync function in the pipeline. * The resolver `request` handler allows to perform some preparation logic * before executing the defined functions in your pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { return {} } /** * Invoked **after** the response handler of the last AppSync function in the pipeline. * The resolver `response` handler allows to perform some final evaluation logic * from the output of the last function to the expected GraphQL field type. * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { return ctx.prev.result }
A continuación, defina la función GET_ITEM
que recupera un elemento postitem del origen de datos:
import { util } from '@aws-appsync/utils' import * as ddb from '@aws-appsync/utils/dynamodb' /** * Request a single item from the attached DynamoDB table datasource * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { const { id } = ctx.args return ddb.get({ key: { id } }) } /** * Returns the result * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const { error, result } = ctx if (error) { return util.appendError(error.message, error.type, result) } return ctx.result }
Si se produce un error durante la solicitud, el controlador de respuestas de la función agrega un error que se devolverá al cliente que realiza la llamada en la respuesta de GraphQL. Añada la función GET_ITEM
a su lista de funciones de solucionador. Al ejecutar la consulta, el controlador de solicitudes de la función GET_ITEM
utiliza las utilidades proporcionadas en el módulo de DynamoDB de AWS AppSync para crear una solicitud DynamoDBGetItem
con el id
como clave. ddb.get({ key: { id } })
genera la operación GetItem
adecuada:
{ "operation" : "GetItem", "key" : { "id" : { "S" : "1" } } }
AWS AppSync utiliza la solicitud para recuperar datos de Amazon DynamoDB. Una vez devueltos los datos, los administra el controlador de respuestas de la función GET_ITEM
, que comprueba si hay errores y, a continuación, devuelve el resultado.
{ "result" : { "id": 1, "title": "hello world", "content": "<long story>" } }
Por último, el controlador de respuestas del solucionador devuelve el resultado directamente.
Solución de errores
Si se produce un error en su función durante una solicitud, el error estará disponible en el controlador de respuestas de función en ctx.error
. Puede agregar el error a su respuesta de GraphQL mediante la utilidad util.appendError
. Puede hacer que el error esté disponible para otras funciones en la canalización con el stash. Vea el ejemplo siguiente:
/** * Returns the result * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const { error, result } = ctx; if (error) { if (!ctx.stash.errors) ctx.stash.errors = [] ctx.stash.errors.push(ctx.error) return util.appendError(error.message, error.type, result); } return ctx.result; }