Как да създадете NodeJS API без да използвате рамка

Как да създадете NodeJS API без да използвате рамка

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





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





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





MAKEUSEOF ВИДЕО НА ДЕНЯ

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

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

mkdir nodejs-api 
cd nodejs-api

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



npm init -y 

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

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





npm install mongoose 

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

как да получите местни канали на roku
const http = require("http"); 
const server = http.createServer((req, res) => {});

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

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





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

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

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

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

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

const mongoose = require("mongoose"); 

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

mongoose.connect("MongoDB_URI") 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

как да изключите 5g на samsung
// 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 }));
}
}

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

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

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

POST Маршрут

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

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

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

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

PUT Маршрут

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

// 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 заявка е почти идентичен с ПУБЛИКУВАНЕ манипулатор на заявки, с изключение на това, че извлича документ за самоличност имот от URL адрес за актуализиране на съответния блог.

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

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

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

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

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

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

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

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

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

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

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

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