Node.js yra atvirojo kodo „JavaScript“ vykdymo laikas, sukurtas naudojant „Chrome“ v8 variklį, leidžiantį paleisti „JavaScript“ kodą ne naršyklėje.
Dėl įvykių modelio, ekosistemos ir greičio Node.js tapo vienu iš labiausiai ieškomų ir naudojamų serverio programų vykdymo laiko.
Dauguma Node.js API serverių naudoja Express arba kitą sistemą. Tačiau taip pat galite sukurti paprastą Node.js API be sistemos atlikdami tik kelis veiksmus.
1 veiksmas: kūrimo aplinkos nustatymas
Sukurkite projekto katalogą ir cd į jį paleisdami:
mkdir nodejs-api
cd nodejs-api
Toliau inicijuokite npm savo projekte vykdydami:
npm init -y
Šioje CRUD API bus naudojama MongoDB, NoSQL duomenų bazė ir jos populiarus ODM, mongoose.
Norėdami įdiegti, paleiskite šią komandą mangustas:
npm diegti mangustas
Tada sukurkite a server.js failą savo projekto šakniniame kataloge ir pridėkite toliau esantį kodo bloką, kad sukurtumėte serverį:
konst http = reikalauti(„http“);
konst serveris = http.createServer((req, res) => {});
serveris.klausykite (3000, () => {
konsolė.log(„Serveris veikia“.);
});
Šis kodo blokas importuoja http modulį, pagrindinį Node.js modulį. http modulis leidžia Node.js perkelti duomenis per HTTP. Šiame modulyje pateikiami serverio sukūrimo metodai.
Tada jis iškviečia http modulį sukurti serverį metodas, kuris sukuria ir grąžina serverio egzempliorių. The sukurti serverį metodas naudoja atgalinio skambinimo funkciją su užklausos ir atsakymo objektu kaip parametrais.
Tada kodas iškviečia klausyk metodas grąžintame serverio egzemplioriuje. Tai leidžia serveriui pradėti klausytis srauto duotame prievade. The klausyk metodas suaktyvina atgalinį skambutį – antrąjį argumentą, kai jis sėkmingas.
Galiausiai sukurkite du pavadinimus maršrutai ir modeliai savo projekto šakniniame kataloge. The maršrutai aplanke bus jūsų API maršruto logika modelis bus viskas, kas susiję su duomenų baze.
2 veiksmas: prijunkite programą prie duomenų bazės
Į server.js, importuoti mangustas:
konst mangustas = reikalauti(„mangustas“);
Paskambinkite į Prisijungti metodas įjungtas mangustas ir perduokite savo MongoDB URI kaip argumentą:
mongoose.connect("MongoDB_URI")
3 veiksmas: sukurkite API modelį
Sukurkite CRUD API, skirtą paprastai tinklaraščio programai. Jūsų modeliai aplanką, sukurkite a blogModel.js failą ir prie failo pridėkite šį kodą:
konst mangustas = reikalauti(„mangustas“);
konst dienoraštisSchema = mangustas. Schema({
pavadinimas: {
tipas: Styga,
reikalaujama: [tiesa, "Tinklaraštis turi turėti pavadinimą"],
},
kūnas: {
tipas: Styga,
reikalaujama: [tiesa, "Tinklaraštis turi turėti kūną"],
},
});
modulis.eksportas = mongoose.model("Tinklaraštis", "BlogSchema");
Aukščiau pateiktas kodo blokas sukuria manguto modelį su dviem savybėmis ir susieja juos su MongoDB duomenų baze.
Abi šio modelio savybės turi a Styga tipo su reikalaujama nustatytas į tiesa. Pridedami klaidų pranešimai bus rodomi, jei užklausos turinyje nėra nė vienos iš ypatybių.
Paskutinė eilutė sukuria ir eksportuoja mangusto modelį skambinant modelis metodas įjungtas mangustas. Perduokite modelio pavadinimą (Dienoraštis) kaip pirmasis argumentas ir schema (dienoraščio schema) kaip antrasis argumentas.
4 veiksmas: maršruto parinkimo diegimas programoje
Be pagalbos tokios sistemos kaip „Express“., turėsite rankiniu būdu sukurti logiką, kad galėtumėte apdoroti kiekvieną jūsų API užklausą.
Pirmiausia sukurkite a blogRoutes.js failą savo maršrutai aplanką, tada importuokite tinklaraščio modelį:
konst Dienoraštis = reikalauti(../models/blogModel");
Tada sukurkite asinchroninį maršrutizatorius funkcija, praeiti req ir res kaip parametrus ir eksportuokite funkciją:
konst maršrutizatorius = asyncfunkcija (req, res) {};
modulis.eksportas = maršrutizatorius;
Šioje funkcijoje bus visa jūsų maršruto logika.
Tada įdiegsite maršruto parinkimo logiką pagal maršrutą.
GAUTI maršrutus
Pridėkite žemiau esantį kodo bloką prie savo maršrutizatorius funkcija įgyvendinti GAUTI maršruto tvarkytojas užklausoms /api/blogs:
// GAUTI: /api/blogs
if (req.url "/api/blogs"&& req.metodas "GAUTI") {
// gauti visus tinklaraščius
konst dienoraščiai = laukti Dienoraštis.rasti();// rinkinys į statusą kodas irturinys-tipo
res.writeHead (200, { "Turinio tipas": "programa/json" });
// siųsti duomenis
res.pabaiga(JSON.sutvirtinti(dienoraščiai));
}
Aukščiau pateiktas kodo blokas patikrina url ir metodas užklausos objekto savybės. Tada jis perkelia visus tinklaraščius iš duomenų bazės per rasti metodas pagal mangusto modelį (Dienoraštis).
Toliau jis vadina rašytiHead metodas įjungtas res, atsakymo objektas. Šis metodas siunčia atsakymo antraštę su trimis argumentais: būsenos kodas, pasirenkamas būsenos pranešimas ir antraštės. The 200 būsenos kodas reiškia sėkmingą atsakymą ir nustatytas šio API iškvietimo turinio tipas programa/json.
Galiausiai uždarykite užklausą, kad įsitikintumėte, jog serveris neužstoja skambindami pabaiga metodas įjungtas res. Skambutis į JSON.stringify paverčia dienoraščiai prieštarauja JSON eilutei ir perduoda ją į pabaiga metodas grąžina jį kaip atsako kūną.
Pridėkite žemiau esantį kodo bloką prie savo maršrutizatorius funkcija įgyvendinti GAUTI vieno šaltinio maršruto tvarkytuvas:
// GAUTI: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.metodas "GAUTI") {
bandyti {
// ištraukite ID iš url
const id = req.url.split("/")[3];// gauti dienoraštį iš DB
konst dienoraštis = laukti Blog.findById (id);
if (tinklaraštis) {
res.writeHead (200, { "Turinio tipas": "programa/json" });
res.pabaiga(JSON.sutvirtinti(dienoraštį));
} Kitas {
mestinaujasKlaida(„Tinklaraštis neegzistuoja“);
}
} sugauti (klaida) {
res.writeHead (404, { "Turinio tipas": "programa/json" });
res.pabaiga(JSON.sutvirtinti({ žinutę: klaida }));
}
}
Šis kodas naudoja rungtynės metodas, kuris kaip argumentą priima reguliariosios išraiškos išraišką, kad patikrintų, ar URL atitinka formatą: /api/blogs/.
Tada ištraukite id turtas iš url eilutę, pavadindamas ją padalintas metodas. Šis metodas naudoja modelį kaip argumentą (/), suskaido eilutę pagal šabloną ir grąžina masyvą. Trečiasis to masyvo elementas yra id.
Galiausiai susigrąžinkite dokumentą su atitikimu id iš savo duomenų bazės. Jei yra, atsiųskite a atsakymo kodas 200, uždarykite užklausą ir išsiųskite gautą tinklaraštį. Jei jo nėra, pateikite klaidą ir išsiųskite ją kaip atsakymą gaudymo bloke.
POST maršrutas
Pridėkite toliau pateiktą kodo bloką prie maršrutizatoriaus funkcijos, kad įgyvendintumėte PAST maršruto tvarkytojas:
// ĮRAŠAS: /api/blogs/
if (req.url "/api/blogs"&& req.metodas "PAST") {
bandyti {
tegul kūnas = "";// Klausyti duomenų įvykio
req.on("duomenis", (gabalas) => {
body += chunk.toString();
});// Klausyk pabaigaįvykis
req.on("pabaiga", asinchroninis () => {
// Sukurti dienoraštį
leisti dienoraštis = naujas Tinklaraštis (JSON.parse (kūnas));
// Išsaugoti DB
laukti dienoraštis.save();
res.writeHead (200, { "Turinio tipas": "programa/json" });
res.pabaiga(JSON.sutvirtinti(dienoraštį));
});
} sugauti (klaida) {
konsolė.log (klaida);
}
}
Užklausos objektas įgyvendina Node.js ReadableStream sąsaja. Šis srautas skleidžia a duomenis ir an pabaiga įvykis, suteikiantis prieigą prie duomenų iš užklausos įstaigos.
Šis kodas klauso duomenų įvykio ir apdoroja jį konvertuodamas į eilutę ir sujungdamas su kūnas kintamasis. Viduje pabaiga įvykių tvarkytojas, jis sukuria a Dienoraštis pavyzdys su išanalizuota kūno eilute. Tada jis išsaugo naują tinklaraštį, išsiunčia būsenos kodą ir turinio antraštę ir uždaro užklausą.
PUT maršrutas
Pridėkite toliau pateiktą kodo bloką prie maršrutizatoriaus funkcijos, kad įgyvendintumėte PUT maršruto tvarkytojas:
// PUT: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.metodas "PUT") {
bandyti {
// ištraukite ID iš url
const id = req.url.split("/")[3];
tegul kūnas = "";req.on("duomenis", (gabalas) => {
body += chunk.toString();
});
req.on("pabaiga", asinchroninis () => {
// Rasti ir atnaujintidokumentas
leisti updatedBlog = laukti Blog.findByIdAndUpdate (id, JSON.parse (body), {
naujas: tiesa,
});
res.writeHead (200, { "Turinio tipas": "programa/json" });
res.pabaiga(JSON.sutvirtinti(atnaujintasBlogas));
});
} sugauti (klaida) {
konsolė.log (klaida);
}
}
PUT užklausų tvarkytuvas yra beveik identiškas PAST užklausų tvarkytojas, išskyrus tai, kad ji ištraukia id turtas iš url atnaujinti atitinkamą tinklaraštį.
IŠTRINTI maršrutą
Pridėkite toliau pateiktą kodo bloką prie maršrutizatoriaus funkcijos, kad įgyvendintumėte savo IŠTRINTI maršruto tvarkytojas:
// IŠTRINTI: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.metodas "IŠTRINTI") {
bandyti {
const id = req.url.split("/")[3];
// Ištrinti dienoraštį iš DB
laukti Blog.findByIdAndDelete (id);
res.writeHead (200, { "Turinio tipas": "programa/json" });
res.end (JSON.stringify({ pranešimas: "Tinklaraštis sėkmingai ištrintas" }));
} sugauti (klaida) {
res.writeHead (404, { "Turinio tipas": "programa/json" });
res.pabaiga(JSON.sutvirtinti({ žinutę: klaida }));
}
}
Šis kodo blokas ištraukia id nuo url, ištrina dokumentą su atitikimu id, siunčia būsenos kodą ir antraštes ir uždaro užklausą.
Galiausiai importuokite maršrutizatorius tavo server.js failą ir paskambinkite savo maršrutizatorius funkcija, perdavimas req ir res kaip argumentai:
konst maršrutizatorius = reikalauti(./routes/blogRoutes");
konst serveris = http.createServer((req, res) => {
maršrutizatorius (req, res);
});
Tai leidžia jūsų serveriui tinkamai perimti ir apdoroti užklausas.
Baigtą projektą rasite čia GitHub saugykla.
Naudojant Node.js Framework
Nors žiniatinklio API galima sukurti rankiniu būdu, tai gali būti sudėtinga užduotis. Turėsite įsitikinti, kad aprėpėte daugybę kraštinių atvejų, o jūsų kodas turėtų būti be klaidų.
Bėgant metams kūrėjai sukūrė tokias sistemas kaip „ExpressJS“, „NestJS“, „Fastify“ ir kt., kad tai būtų daug lengviau.