Voorbij zijn de dagen dat u een aparte backend voor uw website moest maken. Met Next.js op bestanden gebaseerde API-routering kunt u uw leven gemakkelijker maken door uw API binnen een Next.js-project te schrijven.

Next.js is een React-metaframework met functies die het proces van het bouwen van productieklare web-apps vereenvoudigen. U zult zien hoe u een REST API bouwt in Next.js en de gegevens van die API op een Next.js-pagina gebruikt.

Maak een Next.js-project met behulp van create-next-app

U kunt een nieuw Next.js-project maken met behulp van de create-next-app CLI-tool. Het installeert de benodigde pakketten en bestanden om u op weg te helpen met het bouwen van een Next.js-toepassing.

Voer deze opdracht uit in een terminal om een ​​nieuwe map Next.js met de naam api-routes te maken. Mogelijk ontvangt u een prompt om create-next-app te installeren.

npx creëren-volgende-app api-routes

Wanneer de opdracht is voltooid, opent u de map api-routes om te beginnen met het maken van de API-routes.

instagram viewer

API-routering in Next.js

API-routes draaien op de server en hebben vele toepassingen, zoals het opslaan van gebruikersgegevens in een database of het ophalen van gegevens van een API zonder de CORS-beleidsfout.

In Next.js moet u API-routes maken in de map /pages/api. Next.js genereert API-eindpunten voor elk van de bestanden in deze map. Als u user.js toevoegt aan /pages/api, maakt Next.js een eindpunt op http://localhost: 3000/api/gebruiker.

Een standaard Next.js API-route heeft de volgende syntaxis.

exporterenstandaardfunctiebehandelaar(req, res) {
res.status (200).json({ naam: 'John Doe' })
}

U moet de handlerfunctie exporteren om deze te laten werken.

API-routes maken

Maak een nieuw bestand met de naam todo.js in het /pages/api map om een ​​API-route voor todo-items toe te voegen.

De Todo-database bespotten

Om de taken te krijgen, moet u een GET-eindpunt maken. Voor eenvoud. Deze tutorial gebruikt een reeks todo-items in plaats van een database, maar voel je vrij om een ​​database zoals MongoDB of MySQL te gebruiken.

Maak de todo-items in todo.js in de hoofdmap van uw applicatie en voeg vervolgens de volgende gegevens toe.

exporterenconst taken = [
{
identiteitsbewijs: 1,
Te doen: "Doe iets aardigs voor iemand om wie ik geef",
voltooid: WAAR,
gebruikers-ID: 26,
},
{
identiteitsbewijs: 2,
Te doen: "Onthoud de vijftig staten en hun hoofdsteden",
voltooid: vals,
gebruikers-ID: 48,
},
// andere taken
];

Deze todo-items zijn afkomstig van de DummyJSON-website, een REST-API voor nepgegevens. Hiervan kunt u de exacte gegevens vinden DummyJSON todos eindpunt.

Maak vervolgens de API-route in /pages/api/todos.js en voeg de handlerfunctie toe.

importeren { taken } van "../../Te doen";

exporterenfunctiebehandelaar(req, res) {
const { methode } = verzoek;

schakelaar (methode) {
geval "KRIJGEN":
res.toestand(200).json(taken);
pauze;
geval "NA":
const { te doen, voltooid } = req.body;
taken.duw({
ID kaart: taken.lengte + 1,
Te doen,
voltooid,
});
res.toestand(200).json(taken);
pauze;
standaard:
reset.setHeader("Toestaan", ["KRIJGEN", "NA"]);
res.status(405).einde(`Methode ${methode} Niet toegestaan`);
pauze;
}
}

Deze route verwerkt de GET- en POST-eindpunten. Het retourneert alle todo's voor het GET-verzoek en voegt een todo-item toe aan de todo-database voor een POST-verzoek. Voor andere methoden retourneert de handler een fout.

API-routes consumeren in de frontend

U hebt een API-eindpunt gemaakt dat een JSON-object retourneert dat een reeks taken bevat.

Om de API te gebruiken, maakt u een functie met de naam fetchTodos die gegevens ophaalt van het API-eindpunt. De functie gebruikt de ophaalmethode, maar dat kan ook gebruik Axios om API-aanvragen te doen. Roep deze functie dan aan wanneer u op een knop klikt.

importeren Hoofd van "volgende/hoofd";
importeren { useState } van "Reageer";

exporterenstandaardfunctieThuis() {
const [todos, settodos] = useState([]);

const haalTodos = asynchroon () => {
const reactie = wachten ophalen("/api/taken");
const gegevens = wachten reactie.json();
settodos (gegevens);
};

opbrengst (
<div className={styles.container}>
<Hoofd>
<titel>Maak de volgende app</title>
<metanaam="beschrijving" inhoud="Gegenereerd door create next app" />
<link rel="icoon" href="/favicon.ico" />
</Head>
<voornaamst>
<knop onClick={fetchTodos}>Taken ophalen</button>
<ul>
{todos.map((todo) => {
opbrengst (
<li
style={{ color: `${todo.completed? "groente": "rood"}` }}
key={todo.id}
>
{todo.todo}:{todo.completed}.
</li>
);
})}
</ul>
</main>
</div>
);
}

De lijst in dit fragment geeft de todo-items weer wanneer ze worden opgehaald.

Maak voor het POST-eindpunt een nieuwe functie met de naam saveTodo die een POST-verzoek doet aan de API. Het ophaalverzoek slaat het nieuwe todo-item op in de hoofdtekst en retourneert alle todo-items, inclusief de nieuwe. De saveTodo-functie slaat ze vervolgens op in de todos-status.

const saveTodo = asynchroon () => {
const reactie = wachten ophalen("/api/alles", {
methode: "NA",
lichaam: JSON.stringify (nieuweTodo),
koppen: {
"Inhoudstype": "toepassing/json",
},
});

const gegevens = wachten reactie.json();
settodos (gegevens);
};

Maak vervolgens een formulier met een tekstinvoerbalk om het nieuwe todo-item te ontvangen. De verzendhandlerfunctie van dit formulier roept de saveTodo-functie aan.

importeren Hoofd van "volgende/hoofd";
importeren { useReducer, useState } van "Reageer";
importeren stijlen van "../styles/Home.module.css";

exporterenstandaardfunctieThuis() {
const [todos, settodos] = useState([]);

const [newTodo, setnewTodo] = useState({
Te doen: "",
voltooid: vals,
});

const haalTodos = asynchroon () => {
// fetchTodos
};
const saveTodo = asynchroon (e) => {
const reactie = wachten ophalen("/api/alles", {
methode: "NA",
lichaam: JSON.stringify (nieuweTodo),
koppen: {
"Inhoudstype": "toepassing/json",
},
});

const gegevens = wachten reactie.json();
settodos (gegevens);
};

const handleChange = (e) => {
setnewTodo({
Te doen: e.doel.waarde,
});
};

const handleSubmit = (e) => {
e.voorkom standaard();
saveTodo();
setnewTodo({
Te doen: '',
});
};

opbrengst (
<div className={styles.container}>
<Hoofd>
<titel>Maak de volgende app</title>
<metanaam="beschrijving" inhoud="Gegenereerd door create next app" />
<link rel="icoon" href="/favicon.ico" />
</Head>
<voornaamst>
// Haalt de todo-items op wanneer erop wordt geklikt
<knop onClick={fetchTodos}>Taken ophalen</button>

// Slaat een nieuw todo-item op wanneer het wordt ingediend
<formulier onSubmit={handleSubmit}>
<invoertype="tekst" onChange={handleChange} waarde={newTodo.todo} />
</form>
<ul>
{// lijst todo-items}
</ul>
</main>
</div>
);
}

De handler voegt elke keer dat een gebruiker het formulier indient een nieuwe taak toe aan de database. Deze functie werkt ook de todos-waarde bij met behulp van de gegevens die zijn ontvangen van de API, die op zijn beurt het nieuwe todo-item aan de lijst toevoegt.

API-routering is slechts een van de sterke punten van Next.js

Je hebt gezien hoe je een Next.js API-route bouwt en gebruikt. Nu kunt u een full-stack-applicatie maken zonder uw Next.js-projectmap te verlaten. API-routering is een van de vele voordelen die Next.js biedt.

Next.js biedt ook prestatie-optimalisaties zoals het splitsen van codes, lazy loading en ingebouwde CSS-ondersteuning. Als u een website bouwt die snel en SEO-vriendelijk moet zijn, moet u Next.js overwegen.