Borte er dagene da du måtte lage en egen backend for nettstedet ditt. Med Next.js filbasert API-ruting kan du gjøre livet ditt enklere ved å skrive API-en din i et Next.js-prosjekt.

Next.js er et React-meta-rammeverk med funksjoner som forenkler prosessen med å bygge produksjonsklare nettapper. Du vil se hvordan du bygger en REST API i Next.js og bruker dataene fra den APIen på en Next.js-side.

Lag et Next.js-prosjekt ved å bruke create-next-appen

Du kan opprette et nytt Next.js-prosjekt ved å bruke CLI-verktøyet create-next-app. Den installerer de nødvendige pakkene og filene for å komme i gang med å bygge en Next.js-applikasjon.

Kjør denne kommandoen i en terminal for å opprette en ny Next.js-mappe kalt api-routes. Du kan få en melding om å installere create-next-app.

npx skape-neste-app api-ruter

Når kommandoen er ferdig, åpne api-routes-mappen for å begynne å lage API-rutene.

API-ruting i Next.js

API-ruter kjører på serveren og har mange bruksområder som å lagre brukerdata til en database eller hente data fra en API uten å øke CORS policy feil.

instagram viewer

I Next.js må du opprette API-ruter i /pages/api-mappen. Next.js genererer API-endepunkter for hver av filene i denne mappen. Hvis du legger til user.js til /pages/api, vil Next.js opprette et endepunkt på http://localhost: 3000/api/bruker.

En grunnleggende Next.js API-rute har følgende syntaks.

eksportmisligholdefunksjonhandler(krav, res) {
res.status (200).json({ navn: 'John Doe' })
}

Du må eksportere behandlerfunksjonen for at den skal fungere.

Opprette API-ruter

Opprett en ny fil kalt todo.js i /pages/api mappe for å legge til en API-rute for gjøremål.

Håner Todo-databasen

For å få oppgavene må du opprette et GET-endepunkt. For enkelhets skyld. Denne opplæringen bruker en rekke gjøremålselementer i stedet for en database, men bruk gjerne en database som MongoDB eller MySQL.

Opprett gjøremålene i todo.js i rotmappen til programmet, og legg til følgende data.

eksportkonst gjøremål = [
{
id: 1,
å gjøre: "Gjør noe fint for noen jeg bryr meg om",
fullført: ekte,
bruker-ID: 26,
},
{
id: 2,
å gjøre: "Lær de femti statene og deres hovedsteder utenat",
fullført: falsk,
bruker-ID: 48,
},
// andre gjøremål
];

Disse gjøremålene er fra DummyJSON-nettstedet, en REST API for falske data. Du kan finne nøyaktige data fra dette DummyJSON todos-endepunkt.

Deretter oppretter du API-ruten i /pages/api/todos.js og legg til behandlerfunksjonen.

import { todos } fra "../../å gjøre";

eksportfunksjonhandler(krav, res) {
konst { metode } = req;

bytte om (metode) {
sak "":
res.status(200).json(todos);
gå i stykker;
sak "POST":
konst { todo, fullført } = req.body;
todos.trykk({
id: todos.lengde + 1,
å gjøre,
fullført,
});
res.status(200).json(todos);
gå i stykker;
misligholde:
res.setHeader("Tillate", ["", "POST"]);
res.status(405).slutt(`Metode ${method} Ikke tillatt`);
gå i stykker;
}
}

Denne ruten håndterer GET- og POST-endepunktene. Den returnerer alle gjøremålene for GET-forespørselen og legger til et gjøremålselement til gjøremålsdatabasen for en POST-forespørsel. For andre metoder returnerer behandleren en feil.

Bruker API-ruter i grensesnittet

Du har opprettet et API-endepunkt som returnerer et JSON-objekt som inneholder en rekke gjøremål.

For å konsumere API, lag en funksjon kalt fetchTodos som henter data fra API-endepunktet. Funksjonen bruker hentemetoden, men du kan også bruk Axios til å lage API-forespørsler. Deretter kaller du denne funksjonen når du klikker på en knapp.

import Hode fra "neste/hode";
import { useState } fra "reagere";

eksportmisligholdefunksjonHjem() {
konst [todos, settodos] = brukState([]);

konst henteTodos = asynkron () => {
konst svar = avvente hente("/api/todos");
konst data = avvente response.json();
settodos (data);
};

komme tilbake (
<div className={styles.container}>
<Hode>
<tittel>Lag neste app</title>
<metanavn="beskrivelse" innhold="Generert av opprette neste app" />
<link rel="ikon" href="/favicon.ico" />
</Head>
<hoved->
<button onClick={fetchTodos}>Få gjøremål</button>
<ul>
{todos.map((todo) => {
komme tilbake (
<li
style={{ farge: `${todo.completed? "grønn": "rød"}` }}
key={todo.id}
>
{todo.todo}:{todo.completed}.
</li>
);
})}
</ul>
</main>
</div>
);
}

Listen i dette utdraget viser gjøremålene når de hentes.

For POST-endepunktet, lag en ny funksjon kalt saveTodo som sender en POST-forespørsel til APIen. Henteforespørselen lagrer det nye gjøremålselementet i brødteksten og returnerer alle gjøremålselementene inkludert det nye. SaveTodo-funksjonen lagrer dem deretter i todos-tilstanden.

konst saveTodo = asynkron () => {
konst svar = avvente hente("/api/todos", {
metode: "POST",
kropp: JSON.stringify (newTodo),
overskrifter: {
"Innholdstype": "applikasjon/json",
},
});

konst data = avvente response.json();
settodos (data);
};

Deretter oppretter du et skjema med en tekstlinje for å motta det nye gjøremålet. Sendbehandlerfunksjonen til dette skjemaet vil kalle opp saveTodo-funksjonen.

import Hode fra "neste/hode";
import { useReducer, useState } fra "reagere";
import stiler fra "../styles/Home.module.css";

eksportmisligholdefunksjonHjem() {
konst [todos, settodos] = brukState([]);

konst [newTodo, setnewTodo] = useState({
å gjøre: "",
fullført: falsk,
});

konst henteTodos = asynkron () => {
// henteTodos
};
konst saveTodo = asynkron (e) => {
konst svar = avvente hente("/api/todos", {
metode: "POST",
kropp: JSON.stringify (newTodo),
overskrifter: {
"Innholdstype": "applikasjon/json",
},
});

konst data = avvente response.json();
settodos (data);
};

konst handleChange = (e) => {
setnewTodo({
å gjøre: e.mål.verdi,
});
};

konst handleSubmit = (e) => {
e.preventDefault();
lagreTodo();
setnewTodo({
å gjøre: '',
});
};

komme tilbake (
<div className={styles.container}>
<Hode>
<tittel>Lag neste app</title>
<metanavn="beskrivelse" innhold="Generert av opprette neste app" />
<link rel="ikon" href="/favicon.ico" />
</Head>
<hoved->
// Henter gjøremålselementene når de klikkes
<button onClick={fetchTodos}>Få gjøremål</button>

// Lagrer et nytt gjøremål når det sendes inn
<form onSubmit={handleSubmit}>
<input type="tekst" onChange={handleChange} verdi={newTodo.todo} />
</form>
<ul>
{// liste gjøremål}
</ul>
</main>
</div>
);
}

Behandleren legger til en ny gjøremål i databasen hver gang en bruker sender inn skjemaet. Denne funksjonen oppdaterer også gjøremålsverdien ved å bruke dataene mottatt fra APIen som igjen legger til det nye gjøremålselementet til listen.

API-ruting er bare en av Next.js sine styrker

Du har sett hvordan du bygger og bruker en Next.js API-rute. Nå kan du opprette en full stack-applikasjon uten å forlate Next.js-prosjektmappen. API-ruting er en av de mange fordelene som Next.js gir.

Next.js tilbyr også ytelsesoptimaliseringer som kodedeling, lat lasting og innebygd CSS-støtte. Hvis du bygger et nettsted som må være raskt og SEO-vennlig, bør du vurdere Next.js.