Kā izveidot NodeJS API, neizmantojot ietvaru

Kā izveidot NodeJS API, neizmantojot ietvaru

Node.js ir atvērtā pirmkoda JavaScript izpildlaiks, kas izveidots uz Chrome v8 dzinēja, kas ļauj palaist JavaScript kodu ārpus pārlūkprogrammas.





Tā notikumu modelis, ekosistēma un ātrums ir padarījuši Node.js par vienu no visvairāk pieprasītajiem un izmantotākajiem servera puses lietojumprogrammu izpildlaikiem.





Lielākā daļa Node.js API serveru izmanto Express vai citu sistēmu. Tomēr jūs varat arī izveidot vienkāršu Node.js API bez ietvara, veicot tikai dažas darbības.





DIENAS VIDEO MAKEUSEOF

1. darbība: izstrādes vides iestatīšana

Izveidojiet projekta direktoriju un cd iekļūt tajā, palaižot:

mkdir nodejs-api 
cd nodejs-api

Tālāk inicializējiet npm savā projektā, izpildot:



mainīt iphone dublēšanas vietu windows 10
npm init -y 

Šajā CRUD API tiks izmantota MongoDB, NoSQL datu bāze, un tās populārais ODM, mongoose.

Lai instalētu, palaidiet šo komandu mangusts :





npm install mongoose 

Pēc tam izveidojiet a serveris.js failu sava projekta saknes direktorijā un pievienojiet tālāk norādīto koda bloku, lai izveidotu serveri:

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

server.listen(3000, () => {
console.log(`Server is running`);
});

Šis koda bloks importē http moduli — Node.js moduli. http modulis ļauj Node.js pārsūtīt datus, izmantojot HTTP. Šis modulis satur servera izveidei nepieciešamās metodes.





Tālāk tas izsauc http moduli izveidotServeri metode, kas izveido un atgriež servera gadījumu. The izveidotServeri metode izmanto atzvanīšanas funkciju ar pieprasījuma un atbildes objektu kā parametrus.

Tālāk kods izsauc klausies metodi atgrieztajā servera instancē. Tas ļauj serverim sākt klausīties trafiku dotajā portā. The klausies metode aktivizē atzvanīšanu — otro argumentu —, kad tā izdodas.

Visbeidzot, izveidojiet divus direktorijus ar nosaukumu maršrutos un modeļiem sava projekta saknes direktorijā. The maršrutos mapē būs jūsu API maršrutēšanas loģika, kamēr modelis saturēs visu, kas saistīts ar datu bāzi.

2. darbība: lietojumprogrammas savienošana ar datu bāzi

In serveris.js , imports mangusts :

const mongoose = require("mongoose"); 

Zvaniet uz savienot metode ieslēgta mangusts un nododiet savu MongoDB URI kā argumentu:

mongoose.connect("MongoDB_URI") 

3. darbība: API modeļa izveide

Izveidojiet CRUD API vienkāršai emuāra lietojumprogrammai. Tavā modeļiem mapi, izveidojiet a blogModel.js failu un pievienojiet savam failam šādu kodu:

const mongoose = require("mongoose"); 
const blogSchema = mongoose.Schema({
title: {
type: String,
required: [true, "Blog must have a title"],
},
body: {
type: String,
required: [true, "Blog must have a body"],
},
});
module.exports = mongoose.model("Blog", blogSchema);

Iepriekš minētais koda bloks izveido mangustu modeli ar diviem rekvizītiem un kartē tos ar MongoDB datu bāzi.

Abām šī modeļa īpašībām ir a Stīga ierakstiet ar nepieciešams iestatīts uz taisnība . Ja pieprasījuma pamattekstā nav neviena no rekvizītiem, tiks parādīti pievienotie kļūdu ziņojumi.

Pēdējā rinda izveido un eksportē mangustu modeli, izsaucot modelis metode ieslēgta mangusts. Nododiet modeļa nosaukumu ( Emuārs ) kā pirmo argumentu un shēmu ( blogGrafiks ) kā otro argumentu.

4. darbība: maršrutēšanas ieviešana lietojumprogrammā

Bez palīdzības ietvariem, piemēram, Express , jums būs manuāli jāizveido loģika, lai apstrādātu katru jūsu API pieprasījumu.

Vispirms izveidojiet a blogRoutes.js failu savā maršrutos mapi, pēc tam importējiet emuāra modeli:

const Blog = require("../models/blogModel"); 

Pēc tam izveidojiet asinhronu maršrutētājs funkcija, caurlaide req un res kā parametrus un eksportējiet funkciju:

const router = async function (req, res) {}; 
module.exports = router;

Šī funkcija ietvers visu jūsu maršrutēšanas loģiku.

Pēc tam jūs ieviesīsit maršrutēšanas loģikas maršrutu pa maršrutiem.

IEGŪT maršrutus

Pievienojiet tālāk norādīto koda bloku savam maršrutētājs funkciju īstenošanai GŪT maršruta apstrādātājs pieprasījumiem, kas nosūtīti uz /api/blogs :

//  GET: /api/blogs 
if (req.url === "/api/blogs" && req.method === "GET") {
// get all blogs
const blogs = await Blog.find();

// set the status code and content-type
res.writeHead(200, { "Content-Type": "application/json" });

// send data
res.end(JSON.stringify(blogs));
}

Iepriekš esošais koda bloks pārbauda url un metodi pieprasījuma objekta īpašības. Pēc tam tas ienes visus emuārus no datu bāzes, izmantojot atrast metode pēc mangusa modeļa ( Emuārs ).

Tālāk tas izsauc rakstītGalva metode ieslēgta res , atbildes objekts. Šī metode nosūta atbildes galveni, kurai ir trīs argumenti: statusa kods, neobligāts statusa ziņojums un galvenes. The 200 statusa kods apzīmē veiksmīgu atbildi, un šī API izsaukuma satura veids ir iestatīts uz lietojumprogramma/json .

Visbeidzot aizveriet pieprasījumu, lai nodrošinātu, ka serveris neuzkaras, zvanot uz beigas metode ieslēgta res . Zvans uz JSON.stringify pārvērš emuāri iebilst pret JSON virkni un nododot to uz beigas metode atgriež to kā atbildes pamattekstu.

Pievienojiet tālāk norādīto koda bloku savam maršrutētājs funkciju īstenošanai GŪT maršruta apstrādātājs vienam resursam:

// GET: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "GET") {
try {
// extract id from url
const id = req.url.split("/")[3];

// get blog from DB
const blog = await Blog.findById(id);

if (blog) {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
} else {
throw new Error("Blog does not exist");
}
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Šis kods izmanto atbilst metode, kas izmanto regulāro izteiksmi kā argumentu, lai pārbaudītu, vai URL atbilst formātam: /api/blogs/ .

Pēc tam izņemiet id īpašums no url virkni, izsaucot to sadalīt metodi. Šī metode izmanto modeli kā argumentu ( / ), sadala virkni, pamatojoties uz modeli, un atgriež masīvu. Trešais šī masīva elements ir id .

Visbeidzot izgūstiet dokumentu ar atbilstību id no jūsu datu bāzes. Ja tāda pastāv, nosūtiet a atbildes kods 200 , aizveriet pieprasījumu un nosūtiet izgūto emuāru. Ja tā neeksistē, ievadiet kļūdu un nosūtiet to kā atbildi uztveršanas blokā.

POST maršruts

Pievienojiet tālāk norādīto koda bloku savai maršrutētāja funkcijai, lai ieviestu POSTĪT maršruta apstrādātājs:

// POST: /api/blogs/ 
if (req.url === "/api/blogs" && req.method === "POST") {
try {
let body = "";

// Listen for data event
req.on("data", (chunk) => {
body += chunk.toString();
});

// Listen for end event
req.on("end", async () => {
// Create Blog
let blog = new Blog(JSON.parse(body));

// Save to DB
await blog.save();
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
});
} catch (error) {
console.log(error);
}
}

Pieprasījuma objekts īsteno Node.js ReadableStream saskarne. Šī straume izstaro a datus un an beigas notikumu, kas nodrošina piekļuvi datiem no pieprasījuma struktūras.

Šis kods klausās datu notikumu un apstrādā to, pārvēršot to par virkni un savienojot ar ķermeni mainīgs. Iekš beigas notikumu apstrādātājs, tas izveido a Emuārs piemērs ar parsētu pamatvirkni. Pēc tam tas saglabā jauno emuāru, nosūta statusa kodu un satura galveni un aizver pieprasījumu.

PUT maršruts

Pievienojiet tālāk norādīto koda bloku savai maršrutētāja funkcijai, lai ieviestu PUT maršruta apstrādātājs:

kā nomainīt tīkla paroli Windows 10
// PUT: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "PUT") {
try {
// extract id from url
const id = req.url.split("/")[3];
let body = "";

req.on("data", (chunk) => {
body += chunk.toString();
});
req.on("end", async () => {
// Find and update document
let updatedBlog = await Blog.findByIdAndUpdate(id, JSON.parse(body), {
new: true,
});

res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(updatedBlog));
});
} catch (error) {
console.log(error);
}
}

PUT pieprasījumu apstrādātājs ir gandrīz identisks POSTĪT pieprasījumu apstrādātājs, izņemot to, ka tas izņem id īpašums no url lai atjauninātu attiecīgo emuāru.

DZĒST maršrutu

Pievienojiet tālāk norādīto koda bloku savai maršrutētāja funkcijai, lai ieviestu savu DZĒST maršruta apstrādātājs:

// DELETE: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "DELETE") {
try {
const id = req.url.split("/")[3];

// Delete blog from DB
await Blog.findByIdAndDelete(id);
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: "Blog deleted successfully" }));
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Šis koda bloks izvelk id no url , dzēš dokumentu ar atbilstību id , nosūta statusa kodu un galvenes un aizver pieprasījumu.

Visbeidzot, importējiet maršrutētājs tavā serveris.js failu un piezvaniet savam maršrutētājs funkcija, piespēle req un res kā argumenti:

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

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

Tas ļauj jūsu serverim pārtvert un atbilstoši apstrādāt pieprasījumus.

Pabeigto projektu varat atrast šeit GitHub repozitorijs .

Izmantojot Node.js ietvaru

Lai gan tīmekļa API ir iespējams izveidot ar rokām, tas var būt sarežģīts uzdevums. Jums būs jāpārliecinās, ka esat aptvēris daudzus malas gadījumus un jūsu kodam ir jābūt bez kļūdām.

Gadu gaitā izstrādātāji ir izveidojuši tādus ietvarus kā ExpressJS, NestJS, Fastify utt., lai to padarītu daudz vienkāršāku.