Nos últimos anos, além do REST como padrão consolidado para backend, um novo padrão vem sendo cada vez mais difundido devido ao fato que ele tem algumas vantagens em relação ao REST em alguns cenários: o GraphQL. Não exatamente uma novidade, já que o Facebook já criava suas APIs com esse padrão em 2012 (chamada na época de GraphAPI), mas foi só em 2015 que publicaram uma especificação aberta para a comunidade, ajudando na sua popularização.
Como todo padrão aberto, existem diversas implementações de GraphQL e neste tutorial eu vou, além de explicar o que é e para que serve GraphQL, mostrar como implementar uma API neste padrão usando Node.js, Express e TypeScript, uma combinação muito popular.
Se preferir, você pode assistir ao vídeo abaixo ao invés de ler, o conteúdo é o mesmo.
Vamos lá!
#1 – O que é o GraphQL?
Ao invés de te dar uma definição genérica do que é o GraphQL e para que ele serve, acho que convém primeiro te explicar a problemática por trás de sua criação. Quando criamos uma API REST, temos de antemão pensar em como os dados serão consultados e manipulados, certo? Isso porque os endpoints devem estar hard-coded em nosso backend, como uma rota GET /customers para listar os clientes ou outra POST /customers para salvar um. No entanto, esta abordagem rígida do REST traz dois problemas para muitas aplicações modernas.
Primeiro, se eu quiser filtrar clientes por um campo específico e não previsto inicialmente, ou eu tenho de criar e publicar uma nova rota (algo que pode levar tempo e até mesmo envolver outras pessoas) ou então eu tenho de retornar todos e fazer o filtro do meu lado, o que gera muito desperdício de tempo e processamento.
Segundo, se eu quiser utilizar apenas alguns dados dos clientes, ainda assim eu terei de receber todos os dados e pegar apenas o que eu preciso, gerando desperdício de tráfego na rede e consequentemente afetando o tempo no lado do usuário.
A ideia central do GraphQL é justamente permitir o data fetching declarativo, ou seja, quem está pedindo os dados é que decide como eles devem ser filtrados e quais dados devem ser retornados, e não o backend. De uma maneira grosseira de explicar, pense em uma API onde você mandasse a consulta SQL que deseja que ela execute do outro lado. Não é isso que GraphQL faz, não literalmente, mas ajuda a ilustrar bem o conceito.
Resumidamente, o GraphQL então é uma linguagem de consulta e manipulação de dados que permite a leitura dinâmica, escrita (chamada de mutação) e assinatura de alteração de dados (via websockets).
#2 – Setup do Express
Existem duas abordagens comuns para implementar APIs com GraphQL no mercado atualmente: com Apollo ou com Express. Neste tutorial vamos fazer com a segunda opção e em outro momento devo trazer algo com a primeira também. Como em qualquer fluxo de aprendizado de backend, vamos ver primeiro como fazer um CRUD com GraphQL, mais tarde trazendo aspectos mais intermediários como autenticação e até mesmo real-time (websockets).
Crie um novo projeto Node.js, inicialize o package.json e instale as seguintes dependências:







