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á.
Os resolvedores do GraphQL conectam os campos em um esquema de tipo a uma fonte de dados. Os resolvedores são o mecanismo pelo qual as solicitações são atendidas.
Resolvedores em AWS AppSync uso JavaScript para converter uma expressão GraphQL em um formato que a fonte de dados possa usar. Como alternativa, os modelos de mapeamento podem ser escritos em Apache VTL (Velocity Template Language)
Esta seção descreve como configurar resolvedores usando o. JavaScript A seção Tutoriais do Resolver (JavaScript) fornece tutoriais detalhados sobre como implementar resolvedores usando. JavaScript A seção Referência do Resolvedor (JavaScript) fornece uma explicação das operações do utilitário que podem ser usadas com JavaScript resolvedores.
Recomendamos seguir este guia antes de tentar usar qualquer um dos tutoriais mencionados acima.
Nesta seção, mostraremos como criar e configurar resolvedores de consultas e mutações.
nota
Este guia pressupõe que você tenha criado seu esquema e tenha pelo menos uma consulta ou mutação. Se você estiver procurando por assinaturas (dados em tempo real), consulte este guia.
Nesta seção, abordaremos algumas etapas gerais para configurar resolvedores e mostraremos um exemplo com o esquema abaixo:
// schema.graphql file
input CreatePostInput {
title: String
date: AWSDateTime
}
type Post {
id: ID!
title: String
date: AWSDateTime
}
type Mutation {
createPost(input: CreatePostInput!): Post
}
type Query {
getPost: [Post]
}
Criação de resolvedores de consultas básicos
Esta seção mostrará como criar um resolvedor de consultas básico.
-
Faça login no AWS Management Console e abra o AppSyncconsole
. -
No APIs painel, escolha sua API GraphQL.
-
Na barra lateral, escolha Esquema.
-
-
Insira os detalhes do esquema e da fonte de dados. Consulte as seções Criar seu esquema e Anexar uma fonte de dados para obter mais informações.
-
Ao lado do editor de esquemas, há uma janela chamada Resolvedores. Essa caixa contém uma lista dos tipos e campos conforme definido na janela Esquema. É possível anexar resolvedores aos campos. Você provavelmente estará anexando resolvedores às suas operações de campo. Nesta seção, veremos configurações de consultas simples. Em Tipo de consulta, escolha Anexar ao lado do campo da sua consulta.
-
Na página Anexar resolvedor, em Tipo de resolvedor, você pode escolher entre resolvedores de pipeline ou de unidade. Para obter mais informações sobre esses tipos de regra, consulte Resolvedores. Este guia fará uso de
pipeline resolvers
.dica
Ao criar resolvedores de pipeline, suas fontes de dados serão anexadas às funções do pipeline. As funções são geradas depois que você cria o próprio resolvedor de pipeline, e é por isso que não há opção de configurá-lo nesta página. Se você estiver usando um resolvedor de unidades, a fonte de dados estará vinculada diretamente ao resolvedor, portanto, você o definiria nesta página.
Para o tempo de execução do Resolver, escolha
APPSYNC_JS
ativar o JavaScript tempo de execução. -
Você pode ativar o armazenamento em cache dessa API. Recomendamos desativar esse atributo por enquanto. Selecione Criar.
-
Na página Editar resolvedor, há um editor de código chamado Código do resolvedor que permite implementar a lógica para o manipulador e a resposta do resolvedor (etapas anterior e posterior). Para obter mais informações, consulte a visão geral dos JavaScript resolvedores.
nota
Em nosso exemplo, vamos deixar a solicitação em branco e a resposta definida para retornar o resultado da última fonte de dados do contexto:
import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
Abaixo dessa seção, há uma tabela chamada Funções. As funções permitem que você implemente códigos que possam ser reutilizados em vários resolvedores. Em vez de reescrever ou copiar sempre o código, você pode armazenar o código-fonte como uma função a ser adicionada a um resolvedor sempre que precisar.
As funções compõem a maior parte da lista de operações de um pipeline. Ao usar várias funções em um resolvedor, você define a ordem das funções, e elas serão executadas nessa ordem sequencialmente. Elas são executadas depois da função de solicitação e antes do início da função de resposta.
Para adicionar uma nova função, em Funções, escolha Adicionar função e, em seguida, Criar nova função. Como alternativa, pode haver um botão Criar função para escolher.
-
Escolha uma fonte de dados. Essa será a fonte de dados em que o resolvedor vai atuar.
nota
Em nosso exemplo, estamos anexando um resolvedor para
getPost
, que recupera um objetoPost
peloid
. Vamos supor que já tenhamos configurado uma tabela do DynamoDB para esse esquema. Sua chave de partição está vazia e definida comoid
. -
Insira um
Function name
. -
Em Código da função, você precisará implementar o comportamento da função. Isso pode ser confuso, mas cada função terá seu próprio manipulador local de solicitações e respostas. A solicitação é executada e, em seguida, a invocação da fonte de dados é feita para lidar com a solicitação e, em seguida, a resposta da fonte de dados é processada pelo manipulador. O resultado é armazenado no objeto do contexto. Depois disso, a próxima função na lista será executada ou transmitida para o manipulador de resposta da etapa posterior, se for a última.
nota
Em nosso exemplo, estamos anexando um resolvedor ao
getPost
, que obtém uma lista de objetosPost
da fonte de dados. Nossa função de solicitação solicitará os dados da nossa tabela, a tabela passará sua resposta para o contexto (ctx) e, em seguida, a resposta retornará o resultado no contexto. AWS AppSync A força da está em sua interconexão com outros serviços. AWS Como estamos usando o DynamoDB, temos um conjunto de operações para simplificar processos como esses. Também temos alguns exemplos padronizados para outros tipos de fontes de dados.Nosso código será semelhante a este:
import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }
Nesta etapa, adicionamos duas funções:
-
request
: o manipulador de solicitações executa a operação de recuperação na fonte de dados. O argumento contém o objeto de contexto (ctx
) ou alguns dados que estão disponíveis para todos os resolvedores que executam uma operação específica. Por exemplo, ele pode conter dados de autorização, os nomes dos campos que estão sendo resolvidos etc. A instrução return executa uma operação deScan
(confira exemplos aqui). Como estamos trabalhando com o DynamoDB, podemos usar algumas das operações desse serviço. A verificação executa uma busca básica de todos os itens em nossa tabela. O resultado dessa operação é armazenado no objeto de contexto como um contêiner deresult
antes de ser transmitido ao manipulador de respostas. Arequest
é executada antes da resposta no pipeline. -
response
: o manipulador de respostas que retorna o resultado darequest
. O argumento é o objeto de contexto atualizado e a instrução de retorno éctx.prev.result
. Neste ponto do guia, é possível que você não conheça esse valor.ctx
refere-se ao objeto de contexto, eprev
refere-se à operação anterior no pipeline, que era nossarequest
. Oresult
contém os resultados do resolvedor à medida que ele se move pelo pipeline. Se você juntar tudo isso,ctx.prev.result
está retornando o resultado da última operação realizada, que foi o manipulador da solicitação.
-
-
Depois de concluir, escolha Criar.
-
-
De volta à tela do resolvedor, em Funções, escolha o menu suspenso Adicionar função e inclua sua função na sua lista.
-
Escolha Salvar para atualizar o resolvedor.
Para resumir o que aconteceu neste exemplo, você viu uma AWS AppSync função que implementou um manipulador de solicitações e respostas. A função foi responsável por interagir com sua fonte de dados. O manipulador da solicitação enviou uma Scan
operação para AWS AppSync, instruindo-o sobre qual operação realizar na sua fonte de dados do DynamoDB. O manipulador de respostas retornou a lista de itens (ctx.result.items
). A lista de itens foi então mapeada automaticamente para o tipo Post
GraphQL.
Criar resolvedores básicos de mutação
Esta seção mostrará como criar um resolvedor de mutação básico.
-
Faça login no AWS Management Console e abra o AppSyncconsole
. -
No APIs painel, escolha sua API GraphQL.
-
Na barra lateral, escolha Esquema.
-
-
Na seção Resolvedores e no tipo de mutação, escolha Anexar ao lado do seu campo.
nota
Em nosso exemplo, estamos anexando um resolvedor para
createPost
, que recupera um objetoPost
para nossa tabela. Vamos supor que estamos usando a mesma tabela do DynamoDB da última seção. Sua chave de partição está vazia e definida comoid
. -
Na página Anexar resolvedor, em Tipo de resolvedor, escolha
pipeline resolvers
. Como lembrete, você pode encontrar mais informações sobre resolvedores aqui. Para o tempo de execução do Resolver, escolhaAPPSYNC_JS
ativar o JavaScript tempo de execução. -
Você pode ativar o armazenamento em cache dessa API. Recomendamos desativar esse atributo por enquanto. Selecione Criar.
-
Escolha Adicionar função e, em seguida, Criar nova função. Como alternativa, pode haver um botão Criar função para escolher.
-
Selecione sua fonte de dados. Essa deve ser a fonte cujos dados você manipulará com a mutação.
-
Insira um
Function name
. -
Em Código da função, você precisará implementar o comportamento da função. Isso é uma mutação, portanto, o ideal é que a solicitação realize alguma operação de mudança de estado na fonte de dados invocada. O resultado será processado pela função de resposta.
nota
O
createPost
adiciona ou “insere” um novoPost
na tabela com nossos parâmetros como dados. Isso pode ser semelhante a:import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
Nesta etapa, adicionamos as funções
request
eresponse
:-
request
: o manipulador da solicitação aceita o contexto como argumento. A instrução return do manipulador de solicitações executa um comandoPutItem
, que é uma operação integrada do DynamoDB (confira alguns exemplos neste link ou aqui). O comandoPutItem
adiciona um objetoPost
à nossa tabela do DynamoDB considerando o valorkey
da partição (gerado automaticamente porutil.autoid()
) eattributes
a partir da entrada do argumento de contexto (esses são os valores que vamos transmitir em nossa solicitação). Akey
é oid
, e osattributes
são os argumentos de campodate
etitle
. Ambos são pré-formatados por meio do auxiliarutil.dynamodb.toMapValues
para trabalhar com a tabela do DynamoDB. -
response
: a resposta aceita o contexto atualizado e retorna o resultado do manipulador da solicitação.
-
-
Depois de concluir, escolha Criar.
-
-
De volta à tela do resolvedor, em Funções, escolha o menu suspenso Adicionar função e inclua sua função na sua lista.
-
Escolha Salvar para atualizar o resolvedor.
Para resumir o que está acontecendo neste exemplo, converte AWS AppSync automaticamente os argumentos definidos no createPost
campo do seu esquema do GraphQL em operações do DynamoDB. O exemplo armazena registros no DynamoDB usando uma chave do id
, que é criada automaticamente usando nosso auxiliar util.autoId()
. Todos os outros campos que você passar para os argumentos de contexto (ctx.args.input
) de solicitações feitas no AWS AppSync console ou de outra forma serão armazenados como atributos da tabela. Tanto a chave quanto os atributos são mapeados automaticamente para um formato compatível do DynamoDB usando o auxiliar util.dynamodb.toMapValues(values)
.
AWS AppSync também suporta fluxos de trabalho de teste e depuração para edição de resolvedores. Use um objeto context
de simulação para ver o valor do modelo transformado antes da invocá-lo. Uma alternativa é visualizar a execução de solicitação completa de uma fonte de dados de forma interativa ao executar uma consulta. Para obter mais informações, consulte Resolvers de teste e depuração (JavaScript) e Monitoramento e registro.
Resolvedores avançados
Se você estiver seguindo a seção opcional de paginação em Projetar seu esquema, ainda precisará adicionar seu resolvedor à sua solicitação para usar a paginação. Nosso exemplo usou uma paginação de consulta chamada getPosts
para retornar somente uma parte das coisas solicitadas por vez. O código do nosso resolvedor nesse campo pode ter a seguinte aparência:
/**
* Performs a scan on the dynamodb data source
*/
export function request(ctx) {
const { limit = 20, nextToken } = ctx.args;
return { operation: 'Scan', limit, nextToken };
}
/**
* @returns the result of the `put` operation
*/
export function response(ctx) {
const { items: posts = [], nextToken } = ctx.result;
return { posts, nextToken };
}
Na solicitação, transmitimos no contexto dela. Nosso limit
é20
, o que significa que retornamos até 20 Posts
na primeira consulta. Nosso cursor do nextToken
está fixo na primeira entrada da Post
na fonte de dados. Eles são transmitidos para os argumentos. Em seguida, a solicitação executa uma varredura desde a primeira Post
até o número limite de varredura. A fonte de dados armazena o resultado no contexto, que é transmitido para a resposta. A resposta retorna as Posts
que foram recuperadas e, em seguida, define nextToken
como a entrada Post
logo após o limite. A próxima solicitação é enviada para fazer exatamente a mesma coisa, mas começando pelo deslocamento logo após a primeira consulta. Lembre-se de que esses tipos de solicitações são feitos sequencialmente e não de maneira simultânea.