Come creare un server GraphQL utilizzando i percorsi API Next.js

Pubblicato: 2022-03-10
Riepilogo rapido ↬ Questa guida ti insegnerà le basi dei percorsi API Next.js. Inizieremo spiegando cosa sono e perché le API Route sono utili rispetto alle API REST o GraphQL. Quindi, ti guideremo attraverso un tutorial passo dopo passo su come costruire il tuo primo server GraphQL con Next.js e l'API Github.

Next.js ti offre la migliore esperienza di sviluppo con tutte le funzionalità necessarie per la produzione. Fornisce una soluzione semplice per creare la tua API utilizzando le route API Next.js.

In questa guida, impareremo prima cosa sono le API Routes, quindi creeremo un server GraphQL che recupera i dati dall'API Github usando le API Routes Next.js.

Per ottenere il massimo da questo tutorial, è necessaria almeno una conoscenza di base di GraphQL. La conoscenza di Apollo Server aiuterebbe ma non è obbligatoria. Questo tutorial andrebbe a vantaggio di coloro che desiderano estendere le proprie competenze React o Next.js sul lato server ed essere in grado di creare anche la loro prima app full-stack con Next.js e GraphQL.

Quindi, tuffiamoci.

Cosa sono le route API di Next.js?

Next.js è un framework che abilita il rendering di app React sul client e/o sul server. Dalla versione 9, Next.js può ora essere utilizzato per creare API con Node.js, Express, GrapQL e così via. Next.js utilizza il file system per trattare i file all'interno della cartella pages/api come endpoint API. Ciò significa che, ora, sarai in grado di accedere al tuo endpoint API sull'URL https://localhost:3000/api/your-file-name .

Se vieni da React e non hai mai utilizzato Next.js, questo potrebbe creare confusione perché Next.js è un framework React. E come già sappiamo, React viene utilizzato per creare app front-end. Allora perché usare Next.js per le app e le API di back-end?

Bene, Next.js può essere utilizzato sia sul lato client che sul lato server perché è costruito con React, Node.js, Babel e Webpack e, ovviamente, dovrebbe essere utilizzabile anche sul server. Next.js si basa sul server per abilitare i percorsi API e ti consente di utilizzare la tua lingua di backend preferita anche se tecnicamente è un framework React. Spero che tu abbia capito bene.

Finora, abbiamo imparato cosa sono le API Routes. Tuttavia, la vera domanda rimane: perché usare Next.js per costruire un Server GraphQL ? Perché non utilizzare GraphQL o Node.js per farlo? Quindi, confrontiamo le route API Next.js con le soluzioni esistenti per la creazione di API nella sezione successiva.

Percorsi API Next.js rispetto a REST e GraphQL

GraphQL e REST sono ottimi modi per creare API. Sono super popolari e utilizzati da quasi tutti gli sviluppatori al giorno d'oggi. Quindi, perché utilizzare un framework React per creare API? Bene, la risposta rapida è che le route API di Next.js hanno uno scopo diverso perché le route API ti consentono di estendere la tua app Next.js aggiungendo un back-end ad essa.

Esistono soluzioni migliori per la creazione di API come Node.js, Express, GraphQL e così via poiché si concentrano sul back-end. A mio parere, le rotte API dovrebbero essere accoppiate con un lato client per creare un'app full-stack con Next.js. Usare le API Routes per costruire una semplice API è come sottoutilizzare la potenza di Next.js perché è un framework React che ti consente di aggiungere un back-end in pochissimo tempo.

Considera il caso d'uso in cui è necessario aggiungere l'autenticazione a un'app successiva esistente. Invece di creare la parte auth da zero con Node.js o GraphQL, puoi utilizzare le route API per aggiungere l'autenticazione alla tua app e sarà ancora disponibile sull'endpoint https://localhost:3000/api/your-file-name . Le route API non aumenteranno le dimensioni del bundle lato client perché sono bundle solo lato server.

Tuttavia, le route API Next.js sono accessibili solo all'interno della stessa origine perché le route API non specificano le intestazioni Cross-Origin Resource Sharing (CORS). Puoi comunque modificare il comportamento predefinito aggiungendo CORS alla tua API, ma è una configurazione extra. Se generi la tua prossima app in modo statico utilizzando next export , non sarai in grado di utilizzare percorsi API all'interno della tua app.

Finora, abbiamo appreso quando le rotte API potrebbero essere una soluzione migliore rispetto a simili. Ora, sporchiamoci le mani e iniziamo a costruire il nostro server GraphQL.

Altro dopo il salto! Continua a leggere sotto ↓

Impostare

Per avviare una nuova app con Next.js, andremo a Create Next App. È anche possibile configurare manualmente una nuova app con Webpack. Sei più che benvenuto a farlo. Detto questo, apri la tua interfaccia della riga di comando ed esegui questo comando:

 npx create-next-app next-graphql-server

Next.js fornisce un modello di partenza per i percorsi API. Puoi usarlo eseguendo il seguente comando:

 npx create-next-app --example api-routes api-routes-app

In questo tutorial, vogliamo fare tutto da zero, motivo per cui utilizziamo Crea l'app successiva per avviare una nuova app e non il modello iniziale. Ora, struttura il progetto come segue:

 ├── pages | ├── api | | ├── graphql.js | | ├── resolvers | | | └── index.js | | └── schemas | | └── index.js | └── index.js ├── package.json └── yarn.lock

Come abbiamo detto in precedenza, la cartella api è dove risiede la nostra API o server. Poiché utilizzeremo GraphQL, abbiamo bisogno di un risolutore e di uno schema per creare un server GraphQL. L'endpoint del server sarà accessibile nel percorso /api/graphql , che è il punto di ingresso del server GraphQL.

Con questo passo avanti, ora possiamo creare lo schema GraphQL per il nostro server.

Crea gli schemi GraphQL

Come breve riassunto, uno schema GraphQL definisce la forma del grafico dei dati.

Successivamente, è necessario installare apollo-server-micro per utilizzare Apollo Server all'interno di Next.js.

 yarn add apollo-server-micro

Per npm

 npm install apollo-server-micro

Ora creiamo un nuovo schema GraphQL.

In api/schemas/index.js

 import { gql } from "apollo-server-micro"; export const typeDefs = gql` type User { id: ID login: String avatar_url: String } type Query { getUsers: [User] getUser(name: String!): User! }`

Qui, definiamo un tipo di User che descrive la forma di un utente Github. Si aspetta un id di tipo ID , un login e un avatar_url di tipo String. Quindi, utilizziamo il tipo nella query getUsers che deve restituire un array di utenti. Successivamente, ci affidiamo alla query getUser per recuperare un singolo utente. Deve ricevere il nome dell'utente per poterlo recuperare.

Con questo schema GraphQL creato, ora possiamo aggiornare il file del risolutore e creare le funzioni per eseguire queste query sopra.

Crea i risolutori GraphQL

Un risolutore GraphQL è un insieme di funzioni che consente di generare una risposta da una query GraphQL.

Per richiedere dati dall'API Github, è necessario installare la libreria axios . Quindi, apri la tua CLI ed esegui questo comando:

 yarn add axios

O quando si utilizza npm

 npm install axios

Una volta installata la libreria, aggiungiamo ora del codice significativo al file dei risolutori.

In api/resolvers/index.js

 import axios from "axios"; export const resolvers = { Query: { getUsers: async () => { try { const users = await axios.get("https://api.github.com/users"); return users.data.map(({ id, login, avatar_url }) => ({ id, login, avatar_url })); } catch (error) { throw error; } }, getUser: async (_, args) => { try { const user = await axios.get( `https://api.github.com/users/${args.name}` ); return { id: user.data.id, login: user.data.login, avatar_url: user.data.avatar_url }; } catch (error) { throw error; } } } };

Come puoi vedere qui, abbiniamo il nome delle query definito in precedenza sullo schema GraphQL con le funzioni del risolutore. La funzione getUsers ci consente di recuperare tutti gli utenti dall'API e quindi restituire un array di utenti che deve rispecchiare il tipo di User . Successivamente, utilizziamo il metodo getUser per recuperare un singolo utente con l'aiuto del nome passato come parametro.

Con questo in atto, ora abbiamo uno schema GraphQL e un risolutore GraphQL: è ora di combinarli e creare il server GraphQL.

Crea il server GraphQL

Un server GraphQL espone i tuoi dati come API GraphQL. Offre alle app dei clienti il ​​potere di richiedere esattamente i dati di cui hanno bisogno e nient'altro.

In api/graphql.js

 import { ApolloServer } from "apollo-server-micro"; import { typeDefs } from "./schemas"; import { resolvers } from "./resolvers"; const apolloServer = new ApolloServer({ typeDefs, resolvers }); export const config = { api: { bodyParser: false } }; export default apolloServer.createHandler({ path: "/api/graphql" });

Dopo aver importato ApolloServer , lo usiamo per creare una nuova istanza e quindi passiamo lo schema e il risolutore per creare un server GraphQL. Successivamente, dobbiamo dire a Next.js di non analizzare la richiesta in arrivo e lasciare che GraphQL la gestisca per noi. Infine, utilizziamo apolloServer per creare un nuovo gestore, il che significa che il percorso /api/graphql fungerà da punto di ingresso per il nostro server GraphQL.

A differenza del normale Apollo Server, Next.js gestisce per noi l'avvio del server poiché si basa sul rendering lato server. Ecco perché, qui, non dobbiamo avviare il server GraphQL da soli.

Grande! Con questo passo avanti, possiamo ora verificare se il server GraphQL funziona.

Testare il server GraphQL

Dopo aver individuato la radice del progetto, aprirlo sulla CLI, quindi eseguire questo comando:

 yarn dev

O per npm

 npm run dev

Ora, visita https://localhost:3000/api/graphql e aggiungi la query GraphQL di seguito per recuperare tutti gli utenti da Github.

 { getUsers { id login avatar_url } }
get-all-users
get-all-users. (Grande anteprima)

Verifichiamo se possiamo recuperare un singolo utente con questa query.

 query($name: String!){ getUser(name:$name){ login id avatar_url } }
get-utente
get-utente. (Grande anteprima)

Grande! Il nostro server funziona come previsto. Abbiamo finito di creare un server GraphQL utilizzando le route API Next.js.

Conclusione

In questo tutorial, abbiamo esaminato le route API di Next.js spiegando prima cosa sono e quindi creando un server GraphQL con Next.js. La possibilità di aggiungere un back-end alle app Next.js è una caratteristica davvero interessante. Ci permette di estendere le nostre app con un vero backend. Puoi anche andare oltre e connettere un database per creare un'API completa utilizzando i percorsi API. Next.js semplifica sicuramente la creazione di un'app full-stack con le API Routes.

Puoi visualizzare in anteprima il progetto finito su CodeSandbox.

Grazie per aver letto!

Ulteriori risorse

Queste utili risorse ti porteranno oltre lo scopo di questo tutorial.

  • Presentazione delle route API (Next.js 9)
  • Percorsi API Next.js
  • Middleware dei percorsi API