Node.js is een open-source JavaScript-runtime gebouwd op Chrome's v8-engine waarmee u JavaScript-code buiten een browser kunt uitvoeren.

Het gebeurtenismodel, het ecosysteem en de snelheid hebben van Node.js een van de meest gewilde en gebruikte runtimes voor server-side applicaties gemaakt.

De meeste Node.js API-servers gebruiken Express of een ander framework. U kunt echter ook in een paar stappen een eenvoudige Node.js API zonder framework maken.

Stap 1: Uw ontwikkelomgeving instellen

Maak een projectmap en CD erin door te rennen:

mkdir nodejs-api
CD nodejs-api

Initialiseer vervolgens npm in uw project door het volgende uit te voeren:

npm init -y

Deze CRUD API zal het gebruik van MongoDB, een NoSQL-database, en zijn populaire ODM, mangoest, bevatten.

Voer de volgende opdracht uit om te installeren: mangoest:

npm installeren mangoest

Maak vervolgens een server.js bestand in de hoofdmap van uw project en voeg het onderstaande codeblok toe om een ​​server te maken:

const http = vereisen("http");
const server = http.createServer((req, res) => {});
instagram viewer

server.luister (3000, () => {
troosten.log(`Server is actief`);
});

Dit codeblok importeert de http-module, een core Node.js-module. Met de http-module kan Node.js gegevens over HTTP overbrengen. Deze module bevat de methoden die nodig zijn om een ​​server te maken.

Vervolgens roept het de http-module's createServer methode die een instantie van een server maakt en retourneert. De createServer methode neemt een callback-functie met een verzoek- en antwoordobject als parameters.

Vervolgens roept de code de luister methode op de geretourneerde serverinstantie. Hierdoor kan de server beginnen te luisteren naar verkeer op de gegeven poort. De luister methode vuurt een callback af - het tweede argument - wanneer het lukt.

Maak ten slotte twee mappen met de naam routes en modellen in de hoofdmap van uw project. De routes map bevat de routeringslogica voor uw API, terwijl model- bevat alles wat met de database te maken heeft.

Stap 2: Uw toepassing verbinden met een database

In server.js, import mangoest:

const mangoest = vereisen("mangoest");

Bel de aansluiten methode aan mangoest en geef uw MongoDB URI door als argument:

mangoest.connect("MongoDB_URI")

Stap 3: Een API-model maken

Maak een CRUD API voor een eenvoudige blogtoepassing. In uw modellen map, maak een blogModel.js bestand en voeg de volgende code toe aan uw bestand:

const mangoest = vereisen("mangoest");
const blogSchema = mangoest. Schema({
titel: {
type: Snaar,
vereist: [waar, "Blog moet een titel hebben"],
},
lichaam: {
type: Snaar,
vereist: [waar, "Blog moet een lichaam hebben"],
},
});
module.exporteert = mangoest.model("Blog", blogSchema);

Het bovenstaande codeblok maakt een mangoestmodel met twee eigenschappen en wijst deze toe aan een MongoDB-database.

Beide eigenschappen in dit model hebben een Snaar typ met verplicht ingesteld op WAAR. De bijbehorende foutmeldingen worden weergegeven als een aanvraagtekst geen van beide eigenschappen bevat.

De laatste regel maakt en exporteert een mangoestmodel door de. aan te roepen model- methode aan mangoest. Geef de modelnaam door (Blog) als het eerste argument en een schema (blogSchema) als tweede argument.

Stap 4: Routing implementeren in uw toepassing

Zonder de hulp van frameworks zoals Express, moet u handmatig de logica maken om elk verzoek aan uw API af te handelen.

Maak eerst een blogRoutes.js bestand in uw routes map en importeer vervolgens het blogmodel:

const Blog = vereisen("../modellen/blogModel");

Maak vervolgens een asynchroon router functie, pas vereist en res als parameters, en exporteer de functie:

const router = asynchronefunctie (req, res) {};
module.exporteert = router;

Deze functie bevat al uw routeringslogica.

Vervolgens implementeert u de routeringslogica route per route.

KRIJG routes

Voeg het onderstaande codeblok toe aan je router functie om de te implementeren KRIJGEN routebehandelaar voor verzoeken aan /api/blogs:

// GET: /api/blogs
als (req.url "/api/blogs"&& req.methode "KRIJGEN") {
// krijg alle blogs
const blogs = wachten Blog.vind();

// set de toestand code eninhoud-type
res.writeHead (200, { "Inhoudstype": "applicatie/json" });

// verstuur data
res.einde(JSON.stringify(blogs));
}

Het codeblok hierboven controleert de url en methode eigenschappen van het aanvraagobject. Vervolgens haalt het alle blogs op uit de database via de vind methode op het mangoestmodel (Blog).

Vervolgens noemt het de schrijfHoofd methode aan res, het antwoordobject. Deze methode verzendt een antwoordheader met drie argumenten: een statuscode, een optioneel statusbericht en headers. De 200 statuscode staat voor een succesvolle reactie en het inhoudstype voor deze API-aanroep is ingesteld op applicatie/json.

Sluit ten slotte het verzoek om ervoor te zorgen dat de server niet vastloopt door de. aan te roepen einde methode aan res. de oproep om JSON.stringify converteert de blogs bezwaar maken tegen een JSON-tekenreeks en die doorgeven aan de einde methode retourneert het als de antwoordtekst.

Voeg het onderstaande codeblok toe aan je router functie om de te implementeren KRIJGEN route-handler voor een enkele resource:

// GET: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.methode "KRIJGEN") {
proberen {
// extraheer id uit url
const id = req.url.split("/")[3];

// krijg blog van DB
const blog = wachten Blog.findById (id);

als (blog) {
res.writeHead (200, { "Inhoudstype": "applicatie/json" });
res.einde(JSON.stringify(blog));
} anders {
gooiennieuweFout("Blog bestaat niet");
}
} vangst (fout) {
res.writeHead (404, { "Inhoudstype": "applicatie/json" });
res.einde(JSON.stringify({ bericht: fout }));
}
}

Deze code gebruikt de wedstrijd methode, die een regex-expressie als argument gebruikt, om te controleren of de url overeenkomt met het formaat: /api/blogs/.

Pak vervolgens de uit ID kaart eigendom van de url string door zijn. aan te roepen splitsen methode. Deze methode neemt een patroon als argument (/), splitst de tekenreeks op basis van het patroon en retourneert een array. Het derde element van die array is de ID kaart.

Haal ten slotte het document op met de overeenkomende ID kaart uit uw databank. Als het bestaat, stuur dan een antwoordcode van 200, sluit het verzoek en verzend de opgehaalde blog. Als het niet bestaat, gooi dan een fout en stuur het als een antwoord in het catch-blok.

POST-route

Voeg het onderstaande codeblok toe aan uw routerfunctie om de NA routebehandelaar:

// POST: /api/blogs/
als (req.url "/api/blogs"&& req.methode "NA") {
proberen {
laat lichaam = "";

// Luister naar gegevensgebeurtenis
verzoek.op("gegevens", (brok) => {
body += chunk.toString();
});

// Luister naar eindeevenement
verzoek.op("einde", asynchroon () => {
// Blog maken
laten blog = nieuwe Blog(JSON.parse (lichaam));

// Opslaan in DB
wachten blog.save();
res.writeHead (200, { "Inhoudstype": "applicatie/json" });
res.einde(JSON.stringify(blog));
});
} vangst (fout) {
troosten.log (fout);
}
}

Het aanvraagobject implementeert de Node.js ReadableStream koppel. Deze stream zendt een gegevens en een einde gebeurtenis die u toegang geeft tot gegevens van de verzoekinstantie.

Deze code luistert naar de data-gebeurtenis en handelt deze af door deze om te zetten in een tekenreeks en deze samen te voegen met de lichaam variabel. In de einde event handler, het creëert een Blog instantie met de geparseerde body-string. Het slaat vervolgens de nieuwe blog op, verzendt de statuscode en de inhoudsheader en sluit het verzoek.

PUT-route

Voeg het onderstaande codeblok toe aan uw routerfunctie om de LEGGEN routebehandelaar:

// PUT: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.methode "LEGGEN") {
proberen {
// extraheer id uit url
const id = req.url.split("/")[3];
laat lichaam = "";

verzoek.op("gegevens", (brok) => {
body += chunk.toString();
});
verzoek.op("einde", asynchroon () => {
// Vind en updatedocument
laten bijgewerktBlog = wachten Blog.findByIdAndUpdate (id, JSON.parse (lichaam), {
nieuwe: WAAR,
});

res.writeHead (200, { "Inhoudstype": "applicatie/json" });
res.einde(JSON.stringify(bijgewerktBlog));
});
} vangst (fout) {
troosten.log (fout);
}
}

De PUT-verzoekafhandelaar is bijna identiek aan de NA verzoekbehandelaar, behalve dat het de. extraheert ID kaart eigendom van de url om de betreffende blog bij te werken.

VERWIJDER route

Voeg het onderstaande codeblok toe aan uw routerfunctie om uw VERWIJDEREN routebehandelaar:

// VERWIJDEREN: /api/blogs/:ID kaart
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.methode "VERWIJDEREN") {
proberen {
const id = req.url.split("/")[3];

// Verwijderen blog van DB
wachten Blog.findByIdAndDelete (id);
res.writeHead (200, { "Inhoudstype": "applicatie/json" });
res.end (JSON.stringify({ bericht: "Blog succesvol verwijderd" }));
} vangst (fout) {
res.writeHead (404, { "Inhoudstype": "applicatie/json" });
res.einde(JSON.stringify({ bericht: fout }));
}
}

Dit codeblok extraheert de ID kaart van de url, verwijdert het document met de overeenkomende ID kaart, verzendt de statuscode en headers en sluit het verzoek.

Eindelijk, import router in uw server.js bestand en bel uw router functie, passeren vereist en res als argumenten:

const router = vereisen("./routes/blogRoutes");

const server = http.createServer((req, res) => {
router (req, res);
});

Hierdoor kan uw server verzoeken op de juiste manier onderscheppen en afhandelen.

Hierin vind je het gerealiseerde project GitHub-opslagplaats.

Een Node.js Framework gebruiken

Hoewel het mogelijk is om met de hand een web-API te maken, kan het een moeilijke taak zijn. Je moet ervoor zorgen dat je veel randgevallen hebt behandeld en dat je code maar beter vrij is van bugs.

In de loop der jaren hebben ontwikkelaars frameworks zoals ExpressJS, NestJS, Fastify, enz. gebouwd om het veel gemakkelijker te maken.