Referencia a la función de solucionador de JavaScript de AWS AppSync para Lambda - 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.

Referencia a la función de solucionador de JavaScript de AWS AppSync para Lambda

Puede usar las funciones y los solucionadores de AWS AppSync para invocar las funciones de Lambda ubicadas en su cuenta. Puede configurar las cargas útiles de sus solicitudes y la respuesta de sus funciones de Lambda antes de devolverlas a sus clientes. También puede especificar el tipo de operación que se va a realizar en el objeto de solicitud. En esta sección se describen las solicitudes para las operaciones de Lambda admitidas.

Objeto de solicitud

El objeto de solicitud de Lambda gestiona los campos relacionados con la función de Lambda:

export type LambdaRequest = { operation: 'Invoke' | 'BatchInvoke'; invocationType?: 'RequestResponse' | 'Event'; payload: unknown; };

A continuación, se muestra un ejemplo en el que se usa una operación invoke cuyos datos de carga útil son el campo getPost de un esquema de GraphQL junto con sus argumentos del contexto:

export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }

Todo el documento de mapeo se transfiere como la entrada a la función de Lambda, de modo que el ejemplo anterior tendría ahora el siguiente aspecto:

{ "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "input": { "id": "postId1", } } } }

Operación

El origen de datos de Lambda permite definir dos operaciones en el campo operation: Invoke y BatchInvoke. La operación Invoke hace que AWS AppSync llame a la función de Lambda para cada solucionador de campo de GraphQL. BatchInvoke indica a AWS AppSync que realice solicitudes en lotes para el campo de GraphQL actual. El campo operation es obligatorio.

Para Invoke, la solicitud resuelta coincide con la carga útil de entrada de la función de Lambda. Modifiquemos el ejemplo anterior:

export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }

Esto se resuelve y se transfiere a la función de Lambda, que podría tener un aspecto similar al siguiente:

{ "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }

Para BatchInvoke, la solicitud se aplica a cada solucionador de campo del lote. Por motivos de concisión, AWS AppSync combina todos los valores payload de la solicitud en una lista bajo un solo objeto que coincide con el objeto de solicitud. El siguiente controlador de solicitudes de ejemplo muestra esta combinación:

export function request(ctx) { return { operation: 'Invoke', payload: ctx, }; }

Esta solicitud se evalúa y resuelve para dar el siguiente documento de mapeo:

{ "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }

Cada elemento de la lista payload se corresponde con cada elemento individual del lote. También se espera que la función de Lambda devuelva una respuesta en forma de lista que coincida con el orden de los elementos enviados en la solicitud:

[ { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1 { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2 { "data": {...}, "errorMessage": null, "errorType": null } // result for batch item 3 ]

Carga

El campo payload es un contenedor que se utiliza para transferir cualquier dato a la función de Lambda. Si el campo operation se establece en BatchInvoke, AWS AppSync agrupará los valores payload existentes en una lista. El campo payload es opcional.

Tipos de invocación

El origen de datos de Lambda permite definir dos tipos de invocación: RequestResponse y Event. Los tipos de invocación son sinónimos de los tipos de invocación definidos en la API de Lambda. El tipo de invocación RequestResponse permite a AWS AppSync llamar a la función de Lambda de forma sincrónica para esperar una respuesta. La invocación Event permite invocar su función de Lambda de forma asíncrona. Para obtener más información sobre cómo Lambda gestiona las solicitudes de tipo de invocación Event, consulte Invocación asíncrona. El campo invocationType es opcional. Si este campo no se incluye en la solicitud, AWS AppSync utilizará de forma predeterminada el tipo de invocación RequestResponse.

Para cualquier campo invocationType, la solicitud resuelta coincide con la carga útil de entrada de la función de Lambda. Modifiquemos el ejemplo anterior:

export function request(ctx) { return { operation: 'Invoke', invocationType: 'Event', payload: { field: 'getPost', arguments: ctx.args }, }; }

Esto se resuelve y se transfiere a la función de Lambda, que podría tener un aspecto similar al siguiente:

{ "operation": "Invoke", "invocationType": "Event", "payload": { "arguments": { "id": "postId1" } } }

Cuando la operación BatchInvoke se usa junto con el campo de tipo de invocación Event, AWS AppSync combina el solucionador de campos de la misma manera que se mencionó anteriormente, y la solicitud se transfiere a la función de Lambda como un evento asíncrono, con la payload como lista de valores. La respuesta de una solicitud de tipo de invocación Event da como resultado un valor null sin un controlador de respuesta:

{ "data": { "field": null } }

Le recomendamos que deshabilite el almacenamiento en caché de los solucionadores para los solucionadores de tipo de invocación Event, ya que estos no se enviarían a Lambda si hubiera un acierto de caché.

Objeto de respuesta

Al igual que ocurre con otros orígenes de datos, la función de Lambda envía una respuesta a AWS AppSync que debe convertirse en un tipo de GraphQL. El resultado de la función de Lambda se contiene en la propiedad de resultado context (context.result).

Si la forma de la respuesta de la función de Lambda coincide con la forma del tipo de GraphQL, puede reenviar la respuesta mediante el siguiente controlador de respuestas de función:

export function response(ctx) { return ctx.result }

No hay campos obligatorios ni restricciones de forma aplicables al objeto de respuesta. Sin embargo, dado que los tipos de GraphQL son estrictos, la respuesta resuelta debe coincidir con el tipo de GraphQL previsto.

Repuesta de la función de Lambda en lotes

Si el campo operation se establece en BatchInvoke, AWS AppSync espera que la función de Lambda devuelva una lista de elementos. Para que AWS AppSync pueda mapear cada resultado a cada elemento de la solicitud original, la lista de respuestas debe coincidir en tamaño y orden. Se pueden tener elementos null en la lista de respuestas; ctx.result se establece en null en consecuencia.