Cum să creați un API NodeJS fără a utiliza un cadru

Cum să creați un API NodeJS fără a utiliza un cadru

Node.js este un runtime JavaScript open-source construit pe motorul Chrome v8 care vă permite să rulați cod JavaScript în afara unui browser.





Modelul său de evenimente, ecosistemul și viteza au făcut din Node.js unul dintre cele mai căutate și utilizate timpi de execuție pentru aplicațiile de pe server.





Majoritatea serverelor API Node.js folosesc Express sau un alt cadru. Cu toate acestea, puteți crea și un simplu API Node.js fără un cadru în doar câțiva pași.





REALIZAREA VIDEOCLIPULUI ZILEI

Pasul 1: Configurați-vă mediul de dezvoltare

Creați un director de proiect și CD în el rulând:

mkdir nodejs-api 
cd nodejs-api

Apoi, inițializați npm în proiectul dvs. rulând:



npm init -y 

Acest API CRUD va include utilizarea MongoDB, o bază de date NoSQL și popularul său ODM, mangusta.

Rulați următoarea comandă pentru a instala mangustă :





npm install mongoose 

Apoi, creați un server.js fișier în directorul rădăcină al proiectului și adăugați blocul de cod de mai jos pentru a crea un server:

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

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

Acest bloc de cod importă modulul http, un modul principal Node.js. Modulul http permite lui Node.js să transfere date prin HTTP. Acest modul conține metodele necesare pentru a crea un server.





Apoi, apelează modulul http createServer metodă care creează și returnează o instanță a unui server. The createServer metoda preia o funcție de apel invers cu un obiect de cerere și răspuns ca parametri.

Apoi, codul apelează asculta metoda pe instanța de server returnată. Acest lucru permite serverului să înceapă să asculte traficul pe portul dat. The asculta metoda declanșează un callback - al doilea argument - când reușește.

În cele din urmă, creați două directoare numite trasee și modele în directorul rădăcină al proiectului. The trasee folderul va conține logica de rutare pentru API-ul dvs., în timp ce model va contine tot ce este legat de baza de date.

cum se fac aparate de aer condiționat de casă

Pasul 2: Conectarea aplicației la o bază de date

În server.js , import mangustă :

const mongoose = require("mongoose"); 

Suna conectați metoda pe mangustă și transmiteți URI-ul dvs. MongoDB ca argument:

mongoose.connect("MongoDB_URI") 

Pasul 3: Crearea unui model API

Creați un API CRUD pentru o aplicație simplă de blog. În dumneavoastră modele folder, creați un blogModel.js fișier și adăugați următorul cod la fișierul dvs.:

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);

Blocul de cod de mai sus creează un model de mangustă cu două proprietăți și le mapează la o bază de date MongoDB.

Ambele proprietăți din acest model au a Şir tip cu necesar setat la Adevărat . Mesajele de eroare însoțitoare se vor afișa dacă corpul unei cereri nu conține niciuna dintre proprietăți.

Linia finală creează și exportă un model de mangustă apelând la model metoda pe mangustă. Transmite numele modelului ( Blog ) ca prim argument și o schemă ( Programul blogului ) ca al doilea argument.

Pasul 4: Implementarea rutare în aplicația dvs

Fără ajutorul lui cadre precum Express , va trebui să creați manual logica pentru a gestiona fiecare solicitare făcută către API-ul dvs.

Mai întâi, creați un blogRoutes.js dosar în dvs trasee folder, apoi importați modelul blogului:

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

Apoi, creați un asincron router funcţie, trecere solicitat și res ca parametri și exportați funcția:

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

Această funcție va conține toată logica de rutare.

În continuare, veți implementa ruta logică de rutare după rută.

GET rute

Adăugați blocul de cod de mai jos la dvs router funcția de implementare a OBȚINE handler de rută pentru solicitările făcute către /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));
}

Blocul de cod de mai sus verifică url și metodă proprietățile obiectului de cerere. Apoi preia toate blogurile din baza de date prin intermediul găsi metoda pe modelul mangusta ( Blog ).

Windows 10 începe căutarea nu funcționează

Apoi, se numește scrie cap metoda pe res , obiectul răspuns. Această metodă trimite un antet de răspuns cu trei argumente: un cod de stare, un mesaj de stare opțional și anteturi. The 200 codul de stare reprezintă un răspuns de succes, iar tipul de conținut pentru acest apel API este setat la aplicație/json .

În cele din urmă, închideți cererea pentru a vă asigura că serverul nu se blochează apelând la Sfârşit metoda pe res . Apelul la JSON.stringify convertește bloguri obiect la un șir JSON și transmiterea acestuia către Sfârşit metoda returnează ca corp răspuns.

Adăugați blocul de cod de mai jos la dvs router funcția de implementare a OBȚINE handler de rută pentru o singură resursă:

// 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 }));
}
}

Acest cod folosește Meci metoda, care ia o expresie regex ca argument, pentru a verifica dacă adresa URL se potrivește cu formatul: /api/blogs/ .

aplicație pentru a juca jocuri pe imessage

Apoi, extrageți id proprietate din url șir prin apelul său Despică metodă. Această metodă ia un model ca argument ( / ), împarte șirul pe baza modelului și returnează o matrice. Al treilea element al acestei matrice este id .

În cele din urmă, preluați documentul cu potrivirea id din baza ta de date. Dacă există, trimiteți un cod de răspuns de 200 , închideți solicitarea și trimiteți blogul preluat. Dacă nu există, aruncați o eroare și trimiteți-o ca răspuns în blocul catch.

Ruta POST

Adăugați blocul de cod de mai jos la funcția de router pentru a implementa POST handler de rută:

// 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);
}
}

Obiectul cerere implementează Node.js ReadableStream interfata. Acest flux emite a date si un Sfârşit eveniment care vă oferă acces la datele de la organismul de solicitare.

Acest cod ascultă evenimentul de date și îl gestionează convertindu-l într-un șir și concatenându-l la corp variabil. În Sfârşit handler de evenimente, creează un Blog exemplu cu șirul de corp analizat. Apoi salvează noul blog, trimite codul de stare și antetul conținutului și închide solicitarea.

PUT Traseu

Adăugați blocul de cod de mai jos la funcția de router pentru a implementa A PUNE handler de rută:

// 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);
}
}

Handler-ul cererii PUT este aproape identic cu POST handler de cereri, cu excepția faptului că extrage fișierul id proprietate din url pentru a actualiza blogul relevant.

DELETE Ruta

Adăugați blocul de cod de mai jos la funcția de router pentru a vă implementa ȘTERGE handler de rută:

// 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 }));
}
}

Acest bloc de cod extrage fișierul id de la url , șterge documentul cu potrivirea id , trimite codul de stare și anteturile și închide cererea.

În sfârșit, import router în dumneavoastră server.js dosar și sună la dvs router functie, trecere solicitat și res ca argumente:

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

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

Acest lucru permite serverului dvs. să intercepteze și să gestioneze cererile în mod corespunzător.

Puteți găsi proiectul finalizat în aceasta Depozitul GitHub .

Folosind un cadru Node.js

Chiar dacă este posibil să creați manual un API web, poate fi o sarcină dificilă. Va trebui să vă asigurați că ați acoperit o mulțime de cazuri marginale și că codul dvs. ar fi bine să fie fără erori.

De-a lungul anilor, dezvoltatorii au construit cadre precum ExpressJS, NestJS, Fastify etc., pentru a face mult mai ușor.