Node.js je open-source JavaScript runtime izgrađen na chromeovom v8 motoru koji vam omogućuje pokretanje JavaScript koda izvan preglednika.
Njegov model događaja, ekosustav i brzina učinili su Node.js jednim od najtraženijih i najkorištenijih runtimea za aplikacije na strani poslužitelja.
Većina Node.js API poslužitelja koristi Express ili neki drugi okvir. Međutim, također možete stvoriti jednostavan Node.js API bez okvira u samo nekoliko koraka.
Korak 1: Postavljanje vašeg razvojnog okruženja
Napravite imenik projekta i CD u njega tako što ćete pokrenuti:
mkdir nodejs-api
CD nodejs-api
Zatim inicijalizirajte npm u vašem projektu pokretanjem:
npm init -y
Ovaj CRUD API će sadržavati korištenje MongoDB-a, NoSQL baze podataka i njenog popularnog ODM-a, mongoose.
Pokrenite sljedeću naredbu za instalaciju mungos:
npm instalirati mungos
Zatim stvorite a server.js datoteku u korijenskom direktoriju vašeg projekta i dodajte blok koda u nastavku za stvaranje poslužitelja:
konst http = zahtijevati("http");
konst server = http.createServer((req, res) => {});
server.listen (3000, () => {
konzola.log(`Poslužitelj radi`);
});
Ovaj blok koda uvozi http modul, temeljni modul Node.js. http modul omogućuje Node.js prijenos podataka preko HTTP-a. Ovaj modul sadrži metode potrebne za kreiranje poslužitelja.
Zatim poziva http module createServer metoda koja stvara i vraća instancu poslužitelja. The createServer metoda uzima funkciju povratnog poziva s objektom zahtjeva i odgovora kao parametrima.
Zatim, kod poziva slušati metoda na vraćenoj instanci poslužitelja. To omogućuje poslužitelju da počne osluškivati promet na danom priključku. The slušati metoda aktivira povratni poziv—drugi argument—kada uspije.
Na kraju, stvorite dva direktorija pod nazivom rute i modeli u korijenskom direktoriju vašeg projekta. The rute sadržavat će logiku usmjeravanja za vaš API, dok model će sadržavati sve što se odnosi na bazu podataka.
Korak 2: Povezivanje vaše aplikacije s bazom podataka
U server.js, uvoz mungos:
konst mungos = zahtijevati("mungos");
Nazovite Spojiti metoda na mungos i proslijedite svoj MongoDB URI kao argument:
mongoose.connect("MongoDB_URI")
Korak 3: Stvaranje API modela
Napravite CRUD API za jednostavnu blog aplikaciju. U vašem modeli mapu, stvorite a blogModel.js datoteku i dodajte sljedeći kod u svoju datoteku:
konst mungos = zahtijevati("mungos");
konst blogSchema = mungos. Shema({
naslov: {
tip: Niz,
potrebno: [istina, "Blog mora imati naslov"],
},
tijelo: {
tip: Niz,
potrebno: [istina, "Blog mora imati tijelo"],
},
});
modul.izvozi = mongoose.model("Blog", blogSchema);
Gornji blok koda stvara mongoose model s dva svojstva i preslikava ih u MongoDB bazu podataka.
Oba svojstva u ovom modelu imaju a Niz tip sa potreban postavljen pravi. Popratne poruke pogreške prikazat će se ako tijelo zahtjeva ne sadrži nijedno od svojstava.
Posljednji redak stvara i izvozi mungosov model pozivanjem model metoda na mungos. Proslijedite naziv modela (Blog) kao prvi argument i shema (blogSchema) kao drugi argument.
Korak 4: Implementacija usmjeravanja u vašoj aplikaciji
Bez pomoći okviri poput Expressa, morat ćete ručno stvoriti logiku za obradu svakog zahtjeva upućenog vašem API-ju.
Najprije stvorite a blogRoutes.js datoteku u vašem rute mapu, zatim uvezite model bloga:
konst Blog = zahtijevati("../modeli/blogModel");
Zatim stvorite asinkroni ruter funkcija, prolaz zahtijevati i res kao parametre i izvezite funkciju:
konst ruter = asinkronifunkcija (zahtjev, res) {};
modul.izvozi = ruter;
Ova funkcija će sadržavati svu vašu logiku usmjeravanja.
Zatim ćete implementirati logiku usmjeravanja rutu po rutu.
GET Rute
Dodajte blok koda u nastavku u svoj ruter funkcija za implementaciju DOBITI rukovatelj rute za zahtjeve upućene /api/blogs:
// GET: /api/blogs
ako (req.url "/api/blogs"&& tražena metoda "DOBITI") {
// dobiti sve blogove
konst blogovi = čekati Blog.find();// postaviti the status kodirati isadržaj-tip
res.writeHead (200, { "Vrsta sadržaja": "aplikacija/json" });
// slanje podataka
res.kraj(JSON.nanizati(blogovi));
}
Gornji blok koda provjerava url i metoda svojstva objekta zahtjeva. Zatim dohvaća sve blogove iz baze podataka putem pronaći metoda na mungosovom modelu (Blog).
Zatim, poziva writeHead metoda na res, objekt odgovora. Ova metoda šalje zaglavlje odgovora s tri argumenta: šifrom statusa, opcijskom porukom o statusu i zaglavljima. The 200 statusni kod predstavlja uspješan odgovor, a tip sadržaja za ovaj API poziv postavljen je na aplikacija/json.
Na kraju, zatvorite zahtjev kako biste bili sigurni da poslužitelj ne visi pozivom kraj metoda na res. Poziv na JSON.stringify pretvara blogovi objekt na JSON niz i prosljeđivanje toga u kraj metoda ga vraća kao tijelo odgovora.
Dodajte blok koda u nastavku u svoj ruter funkcija za implementaciju DOBITI rukovatelj rutom za jedan resurs:
// GET: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && tražena metoda "DOBITI") {
probati {
// izdvoji ID iz url-a
const id = req.url.split("/")[3];// dobiti blog iz DB-a
konst blog = čekati Blog.findById (id);
if (blog) {
res.writeHead (200, { "Vrsta sadržaja": "aplikacija/json" });
res.kraj(JSON.nanizati(blog));
} drugo {
bacanjenoviGreška("Blog ne postoji");
}
} ulov (pogreška) {
res.writeHead (404, { "Vrsta sadržaja": "aplikacija/json" });
res.kraj(JSON.nanizati({ poruka: pogreška }));
}
}
Ovaj kod koristi odgovarati metoda, koja uzima regex izraz kao argument, kako bi provjerila odgovara li url formatu: /api/blogs/.
Zatim izvucite iskaznica imovine iz url niz pozivanjem njegovog podjela metoda. Ova metoda uzima uzorak kao argument (/), dijeli niz na temelju uzorka i vraća niz. Treći element tog niza je iskaznica.
Na kraju, dohvatite dokument s podudaranjem iskaznica iz vaše baze podataka. Ako postoji, pošaljite a kod odgovora 200, zatvorite zahtjev i pošaljite dohvaćeni blog. Ako ne postoji, javite pogrešku i pošaljite je kao odgovor u catch bloku.
POST ruta
Dodajte blok koda u nastavku funkciji usmjerivača kako biste implementirali POST rukovatelj rutom:
// POST: /api/blogs/
ako (req.url "/api/blogs"&& tražena metoda "POST") {
probati {
neka tijelo = "";// Osluškivanje podatkovnog događaja
req.on("podaci", (komad) => {
tijelo += chunk.toString();
});// Slušajte krajdogađaj
req.on("kraj", asinkroni () => {
// Stvori blog
neka blog = novi Blog(JSON.parse (tijelo));
// Spremi u DB
čekati blog.save();
res.writeHead (200, { "Vrsta sadržaja": "aplikacija/json" });
res.kraj(JSON.nanizati(blog));
});
} ulov (pogreška) {
konzola.log (greška);
}
}
Objekt zahtjeva implementira Node.js ReadableStream sučelje. Ovaj potok emitira a podaci i an kraj događaj koji vam daje pristup podacima iz tijela zahtjeva.
Ovaj kod osluškuje podatkovni događaj i rukuje njime pretvarajući ga u niz i ulančavajući ga u tijelo varijabla. u kraj rukovatelj događajima, stvara a Blog instanca s raščlanjenim nizom tijela. Zatim sprema novi blog, šalje statusni kod i zaglavlje sadržaja i zatvara zahtjev.
PUT Ruta
Dodajte blok koda u nastavku funkciji usmjerivača kako biste implementirali STAVITI rukovatelj rutom:
// PUT: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && tražena metoda "STAVITI") {
probati {
// izdvoji ID iz url-a
const id = req.url.split("/")[3];
neka tijelo = "";req.on("podaci", (komad) => {
tijelo += chunk.toString();
});
req.on("kraj", asinkroni () => {
// Pronađite i Ažurirajdokument
neka ažurirani blog = čekati Blog.findByIdAndUpdate (id, JSON.parse (tijelo), {
novi: pravi,
});
res.writeHead (200, { "Vrsta sadržaja": "aplikacija/json" });
res.kraj(JSON.nanizati(ažuriranBlog));
});
} ulov (pogreška) {
konzola.log (greška);
}
}
Rukovatelj PUT zahtjevima gotovo je identičan POST rukovatelj zahtjevima, osim što izdvaja iskaznica imovine iz url za ažuriranje relevantnog bloga.
IZBRIŠI rutu
Dodajte blok koda u nastavku funkciji usmjerivača kako biste implementirali svoju IZBRISATI rukovatelj rutom:
// IZBRISATI: /api/blogs/:iskaznica
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && tražena metoda "IZBRISATI") {
probati {
const id = req.url.split("/")[3];
// Izbrisati blog iz DB
čekati Blog.findByIdAndDelete (id);
res.writeHead (200, { "Vrsta sadržaja": "aplikacija/json" });
res.end (JSON.stringify({ poruka: "Blog je uspješno izbrisan" }));
} ulov (pogreška) {
res.writeHead (404, { "Vrsta sadržaja": "aplikacija/json" });
res.kraj(JSON.nanizati({ poruka: pogreška }));
}
}
Ovaj blok koda izdvaja iskaznica od url, briše dokument s odgovarajućim iskaznica, šalje statusni kod i zaglavlja i zatvara zahtjev.
Na kraju, uvoz ruter u vašem server.js datoteku i nazovite svoju ruter funkcija, prolaznost zahtijevati i res kao argumenti:
konst ruter = zahtijevati("./rute/blogRoutes");
konst poslužitelj = http.createServer((req, res) => {
usmjerivač (req, res);
});
To omogućuje vašem poslužitelju presretanje i obradu zahtjeva na odgovarajući način.
Dovršeni projekt možete pronaći ovdje GitHub spremište.
Korištenje okvira Node.js
Iako je moguće izraditi web API ručno, to može biti težak zadatak. Morat ćete provjeriti jeste li pokrili mnogo rubnih slučajeva i bolje bi bilo da vaš kod bude bez grešaka.
Tijekom godina programeri su izgradili okvire kao što su ExpressJS, NestJS, Fastify itd. kako bi to učinili mnogo lakšim.