Indo sem servidor com NodeJS e GraphQL (Parte II) – Implementando o GraphQL no AWS Lambda

Dasith Kuruppu Blocked Unblock Seguir Seguindo 26 de dezembro de 2018

Antes de ler este artigo, observe que há o artigo inicial sobre modelos de formação de nuvem aqui .

Continuando de onde paramos no artigo anterior. Estaremos analisando a integração do GraphQL na função Lambda que criamos no modelo de formação de nuvens. Mas primeiro, vamos aprender um pouco sobre o GraphQL.

GraphQL é uma linguagem de consulta e tempo de execução que podemos usar para criar e expor APIs como um esquema fortemente tipado, em vez de centenas de pontos de extremidade REST. Seus clientes veem o esquema. Eles escrevem uma consulta para o que querem. Eles enviam e recuperam exatamente os dados que pediram e nada mais. {Fonte: Um Guia para o GraphQL em Inglês Simples por Luis Aguilar }

GraphQL de um olho de pássaros: fonte

Como mostra a imagem acima, GraphQL representa um conjunto de dados que se ramifica a partir de um único ponto de extremidade com um mapa de ponteiros / referências para mais dados relacionados. A flexibilidade total é dada ao cliente para consultar dados como quiser.

Voltar para a nossa função Lambda – Comece criando um handler.js ou no meu caso eu vou estar criando handler.ts (arquivo TypeScript) que irá compilar para o handler.js com a ajuda de Webpack e Babel 7. (Você pode encontrar o arquivo Configuração do Webpack e plugins usados aqui ). O handler.ts conteria a seguinte função:

Aqui nós exportamos uma função assíncrona queryEvents que tem acesso aos argumentos padrão fornecidos pelo gateway da API, ou seja, event, context, and callback No nosso caso, precisamos apenas de event e context . Não precisaremos da função de callback porque estaremos usando async/await .

Estamos sempre esperando uma consulta GraphQL para este nó de extremidade / caminho, então vamos analisar o event.body para converter JSON em um objeto JavaScript.

Nós estaremos usando o pacote graphql que pode ser instalado usando o npm install graphql . Nós importamos o graphql para a nossa função do Lambda e o invocamos com a consulta analisada.

GraphQL espera um esquema. Eu vou estar usando um esquema simples como este para começar:

O esquema acima especifica algumas consultas e mutações. Uma consulta no GraphQL é usada para ler dados e uma mutação é usada para alterar dados, ou seja, geralmente em uma camada persistente. Também fornecemos os campos que os dados conteriam e para o que isso seria resolvido. Em nosso caso, a resolução chama uma função que, por sua vez, faz uma chamada assíncrona para o banco de dados (DynamoDb) para ler ou alterar dados. Por exemplo, o viewEvent(args.id) chama a função abaixo

Uma vez que tudo isso esteja definido (você pode encontrar o restante dos resolvedores / eventos aqui ), você pode começar a criar os recursos no modelo e implantar o código na função Lamda executando:

serverless deploy -v — stage=default

Note que para isso funcionar você precisa seguir os passos parte I ou leia-me clonado e seguido em Boilerplate sem servidor

Isso implanta os recursos relevantes necessários e, finalmente, fornece uma URL para acessar a função lambda, veja abaixo.

Agora você pode instalar o GraphQL Playground e usá-lo para executar consultas contra esse URL.

Selecione o url endpoint e cole o URL copiado do terminal. Abra o URL para consultar o terminal. Vamos tentar executar uma consulta mutate para criar um evento:

que deve dar-lhe uma saída como a seguinte…

E isso deve ser o suficiente para você começar a usar o GraphQL. O repositório / boilerplate abaixo ajudará você a começar imediatamente. Ele fornece modelos yml sem servidor, API GraphQL, configuração Typescript / webpack, recursos de teste de unidade Jest, offline sem servidor, recursos de depuração em pipelines VS-Code e CI / CD no git-lab imediatamente!

Dasith Kuruppu / serverlessgraphql
Um clichê sem servidor com GraphQL API, JEST para testes, Typescript / Ts-lint & Git-lab CI / CD. gitlab.com
DasithKuruppu / serverlessGraphQL
Placa padrão para serverless / lambda no AWS usando Cloud Formation com graphQL como API… github.com