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.