Node.js е среда за изпълнение на JavaScript с отворен код, изградена върху двигателя v8 на chrome, който ви позволява да изпълнявате JavaScript код извън браузър.

Неговият модел на събития, екосистема и скорост направиха Node.js едно от най-желаните и използвани среди за изпълнение на сървърни приложения.

Повечето Node.js API сървъри използват Express или друга рамка. Можете също така да създадете прост Node.js API без рамка само с няколко стъпки.

Стъпка 1: Настройване на вашата среда за разработка

Създайте директория на проекта и cd в него, като стартирате:

mkdir nodejs-api
cd nodejs-api

След това инициализирайте npm във вашия проект, като стартирате:

npm init -y

Този CRUD API ще включва използването на MongoDB, NoSQL база данни, и неговия популярен ODM, mongoose.

Изпълнете следната команда, за да инсталирате мангуста:

npm Инсталирай мангуста

След това създайте a server.js файл в главната директория на вашия проект и добавете кодовия блок по-долу, за да създадете сървър:

конст http = изискват("http");
конст сървър = http.createServer((req, res) => {});
instagram viewer

server.listen (3000, () => {
конзола.log(`Сървърът работи`);
});

Този кодов блок импортира http модула, основен модул Node.js. http модулът позволява на Node.js да прехвърля данни през HTTP. Този модул съдържа методите, необходими за създаване на сървър.

След това извиква http модула createServer метод, който създава и връща екземпляр на сървър. The createServer метод приема функция за обратно извикване с обект на заявка и отговор като параметри.

След това кодът извиква слушам метод на върнатия сървърен екземпляр. Това позволява на сървъра да започне да слуша за трафик на дадения порт. The слушам методът задейства обратно извикване - вторият аргумент - когато успее.

Накрая създайте две директории с име маршрути и модели в основната директория на вашия проект. The маршрути ще съдържа логиката за маршрутизиране за вашия API, докато модел ще съдържа всичко свързано с базата данни.

Стъпка 2: Свързване на вашето приложение към база данни

в server.js, внос мангуста:

конст мангуста = изискват("мангуста");

Обадете се на свържете се метод на мангуста и предайте вашия MongoDB URI като аргумент:

mongoose.connect("MongoDB_URI")

Стъпка 3: Създаване на API модел

Създайте CRUD API за просто блог приложение. Във вашия модели папка, създайте a blogModel.js файл и добавете следния код към вашия файл:

конст мангуста = изискват("мангуста");
конст blogSchema = мангуста. Схема ({
заглавие: {
Тип: низ,
задължително: [вярно, "Блогът трябва да има заглавие"],
},
тяло: {
Тип: низ,
задължително: [вярно, "Блогът трябва да има тяло"],
},
});
модул.износ = mongoose.model("Блог", blogSchema);

Кодовият блок по-горе създава mongoose модел с две свойства и ги картографира към база данни MongoDB.

И двата имота в този модел имат a низ тип с изисква се настроен на вярно. Придружаващите съобщения за грешка ще се покажат, ако тялото на заявката не съдържа нито едно от свойствата.

Последният ред създава и експортира мангуст модел чрез извикване на модел метод на мангуста. Предайте името на модела (Блог) като първи аргумент и схема (blogSchema) като втори аргумент.

Стъпка 4: Внедряване на маршрутизиране във вашето приложение

Без помощта на рамки като Express, ще трябва ръчно да създадете логиката за обработка на всяка заявка, направена към вашия API.

Първо създайте a blogRoutes.js файл във вашия маршрути папка, след което импортирайте модела на блога:

конст Блог = изискват("../models/blogModel");

След това създайте асинхронен рутер функция, пас изискване и рез като параметри и експортирайте функцията:

конст рутер = асинхроненфункция (req, res) {};
модул.износ = рутер;

Тази функция ще съдържа цялата ви логика за маршрутизиране.

След това ще приложите логиката на маршрутизиране маршрут по маршрут.

ВЗЕМЕТЕ маршрути

Добавете кодовия блок по-долу към вашия рутер функция за прилагане на ВЗЕМЕТЕ манипулатор на маршрути за заявки, направени до /api/blogs:

// GET: /api/blogs
ако (req.url "/api/blogs"&& req.method "ВЗЕМЕТЕ") {
// вземете всички блогове
конст блогове = изчакайте Blog.find();

// комплект на състояние код исъдържание-Тип
res.writeHead (200, { "Тип съдържание": "приложение/json" });

// изпраща данни
рез.край(JSON.нанизвам(блогове));
}

Кодовият блок по-горе проверява URL адрес и метод свойства на обекта на заявката. След това извлича всички блогове от базата данни чрез намирам метод на мангуст модел (Блог).

След това извиква writeHead метод на рез, обектът на отговора. Този метод изпраща заглавка на отговор с три аргумента: код на състояние, незадължително съобщение за състояние и заглавки. The 200 кодът на състоянието представлява успешен отговор и типът съдържание за това извикване на API е зададен на приложение/json.

Накрая затворете заявката, за да се уверите, че сървърът няма да увисне, като извикате край метод на рез. Обаждането до JSON.stringify преобразува блогове обект към JSON низ и предаването му на край го връща като тяло на отговора.

Добавете кодовия блок по-долу към вашия рутер функция за прилагане на ВЗЕМЕТЕ манипулатор на маршрут за единичен ресурс:

// GET: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.method "ВЗЕМЕТЕ") {
опитвам {
// извличане на id от url
const id = req.url.split("/")[3];

// вземете блог от DB
конст блог = изчакайте Blog.findById (id);

ако (блог) {
res.writeHead (200, { "Тип съдържание": "приложение/json" });
рез.край(JSON.нанизвам(блог));
} друго {
хвърлямновГрешка(„Блогът не съществува“);
}
} улов (грешка) {
res.writeHead (404, { "Тип съдържание": "приложение/json" });
рез.край(JSON.нанизвам({ съобщение: грешка }));
}
}

Този код използва съвпада метод, който приема регулярен израз като аргумент, за да провери дали URL адресът съответства на формата: /api/blogs/.

След това извлечете документ за самоличност имот от URL адрес низ чрез извикване на неговия разделяне метод. Този метод приема модел като аргумент (/), разделя низа въз основа на шаблона и връща масив. Третият елемент от този масив е документ за самоличност.

Накрая извлечете документа със съвпадението документ за самоличност от вашата база данни. Ако съществува, изпратете a код за отговор 200, затворете заявката и изпратете извлечения блог. Ако не съществува, хвърлете грешка и я изпратете като отговор в блока catch.

POST Маршрут

Добавете кодовия блок по-долу към функцията на вашия рутер, за да приложите ПУБЛИКУВАНЕ манипулатор на маршрут:

// ПУБЛИКУВАНЕ: /api/blogs/
ако (req.url "/api/blogs"&& req.method "ПУБЛИКУВАНЕ") {
опитвам {
нека тяло = "";

// Слушане за събитие с данни
req.on("данни", (парче) => {
тяло += chunk.toString();
});

// Слушайте крайсъбитие
req.on("край", асинхронен () => {
// Създаване на блог
позволявам блог = нов блог(JSON.parse (тяло));

// Запазване в DB
изчакайте blog.save();
res.writeHead (200, { "Тип съдържание": "приложение/json" });
рез.край(JSON.нанизвам(блог));
});
} улов (грешка) {
конзола.log (грешка);
}
}

Обектът на заявката имплементира Node.js ReadableStream интерфейс. Този поток излъчва a данни и ан край събитие, което ви дава достъп до данни от тялото на заявката.

Този код слуша събитието с данни и го обработва, като го преобразува в низ и го свързва към тяло променлива. В край манипулатор на събития, той създава a Блог екземпляр с анализирания основен низ. След това записва новия блог, изпраща кода на състоянието и заглавката на съдържанието и затваря заявката.

PUT Маршрут

Добавете кодовия блок по-долу към функцията на вашия рутер, за да приложите СЛАГАМ манипулатор на маршрут:

// ПОСТАВЕТЕ: /api/blogs/:id
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.method "СЛАГАМ") {
опитвам {
// извличане на id от url
const id = req.url.split("/")[3];
нека тяло = "";

req.on("данни", (парче) => {
тяло += chunk.toString();
});
req.on("край", асинхронен () => {
// Намерете и актуализациядокумент
позволявам актуализиран блог = изчакайте Blog.findByIdAndUpdate (id, JSON.parse (тяло), {
нов: вярно,
});

res.writeHead (200, { "Тип съдържание": "приложение/json" });
рез.край(JSON.нанизвам(актуализиран блог));
});
} улов (грешка) {
конзола.log (грешка);
}
}

Обработчикът на PUT заявка е почти идентичен с ПУБЛИКУВАНЕ манипулатор на заявки, с изключение на това, че извлича документ за самоличност имот от URL адрес за актуализиране на съответния блог.

ИЗТРИВАНЕ на маршрут

Добавете кодовия блок по-долу към функцията на вашия рутер, за да приложите вашата ИЗТРИЙ манипулатор на маршрут:

// ИЗТРИЙ: /api/блогове/:документ за самоличност
if (req.url.match(/\\/api\\/blogs\\/([0-9]+)/) && req.method "ИЗТРИЙ") {
опитвам {
const id = req.url.split("/")[3];

// Изтрий блог от DB
изчакайте Blog.findByIdAndDelete (id);
res.writeHead (200, { "Тип съдържание": "приложение/json" });
res.end (JSON.stringify({ съобщение: "Блогът е изтрит успешно" }));
} улов (грешка) {
res.writeHead (404, { "Тип съдържание": "приложение/json" });
рез.край(JSON.нанизвам({ съобщение: грешка }));
}
}

Този кодов блок извлича документ за самоличност от URL адрес, изтрива документа със съвпадението документ за самоличност, изпраща кода на състоянието и заглавките и затваря заявката.

И накрая, импортирайте рутер във вашия server.js файл и се обадете на вашия рутер функция, преминаване изискване и рез като аргументи:

конст рутер = изискват("./routes/blogRoutes");

конст сървър = http.createServer((req, res) => {
рутер (req, res);
});

Това позволява на вашия сървър да прихваща и обработва заявките по подходящ начин.

Тук можете да намерите завършения проект GitHub хранилище.

Използване на рамка Node.js

Въпреки че е възможно да създадете уеб API на ръка, това може да бъде трудна задача. Ще трябва да се уверите, че сте покрили много крайни случаи и е по-добре кодът ви да е без грешки.

През годините разработчиците изградиха рамки като ExpressJS, NestJS, Fastify и т.н., за да го направят много по-лесно.