As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Referência de função do resolvedor de JavaScript do AWS AppSync para Lambda
Você pode usar funções e resolvedores do AWS AppSync para invocar funções do Lambda localizadas em sua conta. Você pode moldar suas cargas úteis de solicitação e a resposta de suas funções do Lambda antes de devolvê-las aos seus clientes. Também é possível especificar o tipo de operação a ser executada no seu objeto de solicitação. Esta seção descreve as solicitações para operações Lambda compatíveis.
Objeto de solicitação
O objeto de solicitação do Lambda manipula campos relacionados à sua função do Lambda:
export type LambdaRequest = { operation: 'Invoke' | 'BatchInvoke'; invocationType?: 'RequestResponse' | 'Event'; payload: unknown; };
Aqui está um exemplo que usa uma operação invoke
com seus dados de carga útil sendo o campo getPost
de um esquema GraphQL junto com seus argumentos do contexto:
export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }
Todo o documento de mapeamento é passado como entrada para sua função do Lambda, assim o exemplo anterior agora tem esta aparência:
{ "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "input": { "id": "postId1", } } } }
Operation
A fonte de dados do Lambda permite que você defina duas operações no campo operation
: Invoke
e BatchInvoke
. A Invoke
permite que o AWS AppSync saiba chamar sua função do Lambda para cada resolvedor do campo GraphQL, enquanto BatchInvoke
instrui o AWS AppSync para solicitações em lote do campo GraphQL atual. O campo operation
é obrigatório.
Para Invoke
, a solicitação resolvida corresponde à carga útil de entrada da função do Lambda. Vamos modificar o exemplo acima:
export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }
Isso é resolvido e passado para a função do Lambda, que poderá ser mais ou menos assim:
{ "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }
Para BatchInvoke
, a solicitação é aplicada a cada resolvedor de campo no lote. Para ser conciso, o AWS AppSync mescla todos os valores de payload
da solicitação em uma lista sob um único objeto correspondente ao objeto da solicitação. Veja um exemplo de mesclagem pelo manipulador de solicitação:
export function request(ctx) { return { operation: 'Invoke', payload: ctx, }; }
Essa solicitação é avaliada e resolvida no seguinte documento de mapeamento:
{ "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }
Cada elemento da lista payload
corresponde a um único item de lote. Também se espera que a função do Lambda retorne uma resposta em forma de lista correspondente à ordem dos itens enviados na solicitação:
[ { "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 útil
O campo payload
é um contêiner usado para passar quaisquer dados para a função do Lambda. Se o campo operation
estiver definido como BatchInvoke
, o AWS AppSync envolverá os valores de payload
existentes em uma lista. O campo payload
é opcional.
Tipo de invocação
A fonte de dados do Lambda permite que você defina dois tipos de invocação: RequestResponse
e Event
. Os tipos de invocação são sinônimos dos tipos de invocação definidos na API do Lambda. O tipo de invocação RequestResponse
permite que o AWS AppSync chame sua função do Lambda de forma síncrona para aguardar uma resposta. A invocação Event
permite que você invoque sua função do Lambda de forma assíncrona. Para obter mais informações sobre como o Lambda lida com solicitações de tipo de invocação Event
, consulte Invocação assíncrona. O campo invocationType
é opcional. Se esse campo não for incluído na solicitação, o AWS AppSync usará como padrão o tipo de invocação RequestResponse
.
Para qualquer campo invocationType
, a solicitação resolvida corresponde à carga útil de entrada da função do Lambda. Vamos modificar o exemplo acima:
export function request(ctx) { return { operation: 'Invoke', invocationType: 'Event', payload: { field: 'getPost', arguments: ctx.args }, }; }
Isso é resolvido e passado para a função do Lambda, que poderá ser mais ou menos assim:
{ "operation": "Invoke", "invocationType": "Event", "payload": { "arguments": { "id": "postId1" } } }
Quando a operação BatchInvoke
é usada em conjunto com o campo do tipo de invocação Event
, o AWS AppSync mescla o resolvedor de campo da mesma forma mencionada acima, e a solicitação é passada para sua função do Lambda como um evento assíncrono, sendo payload
uma lista de valores. A resposta de uma solicitação do tipo de invocação Event
resulta em um valor null
sem um manipulador de resposta:
{ "data": { "field": null } }
Recomendamos que você desative o cache do resolvedor para resolvedores do tipo de invocação Event
, pois eles não seriam enviados ao Lambda se houvesse um acerto do cache.
Objeto da resposta
Assim como ocorre com outras fontes de dados, sua função do Lambda envia uma resposta ao AWS AppSync que precisa ser convertida em um tipo do GraphQL. O resultado da função do Lambda é contido na propriedade de resultado context
(context.result
).
Se a forma da resposta da função do Lambda corresponder à forma do tipo do GraphQL, você pode encaminhar a resposta usando o seguinte manipulador de função da resposta:
export function response(ctx) { return ctx.result }
Não existem campos obrigatórios ou restrições de forma que se aplicam ao objeto de retorno. No entanto, como o GraphQL tem vários tipos, a resposta resolvida deve corresponder ao tipo do GraphQL esperado.
Resposta em lote da função do Lambda
Se o campo operation
estiver definido como BatchInvoke
, o AWS AppSync espera de volta uma lista de itens da função do Lambda. Para que o AWS AppSync mapeie cada resultado de volta ao item da solicitação original, a lista da resposta deve corresponder em tamanho e ordem. É válido ter itens null
na lista de respostas; ctx.result
será adequadamente definido como nulo.