خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه یک NodeJS API بدون استفاده از چارچوب ایجاد کنیم

چارچوب‌ها زندگی شما را آسان‌تر می‌کنند و برنامه‌هایتان را قوی‌تر می‌کنند. اما دانستن نحوه ساخت یک API بدون آن می تواند مفید باشد.

Node.js یک زمان اجرا جاوا اسکریپت منبع باز است که بر روی موتور v8 کروم ساخته شده است که به شما امکان می دهد کد جاوا اسکریپت را خارج از مرورگر اجرا کنید.

مدل رویداد، اکوسیستم و سرعت آن، Node.js را به یکی از محبوب‌ترین و مورد استفاده‌ترین زمان‌های اجرا برای برنامه‌های سمت سرور تبدیل کرده است.

اکثر سرورهای Node.js API از Express یا چارچوب دیگری استفاده می کنند. با این حال، شما همچنین می توانید یک Node.js API ساده بدون چارچوب تنها در چند مرحله ایجاد کنید.

مرحله 1: محیط توسعه خود را تنظیم کنید

یک دایرکتوری پروژه ایجاد کنید و سی دی در آن با اجرای:

mkdir nodejs-api
cd nodejs-api

سپس، npm را در پروژه خود با اجرای:

npm init -y

این CRUD API استفاده از MongoDB، یک پایگاه داده NoSQL، و ODM محبوب آن، mongoose را نشان می دهد.

برای نصب mongoose دستور زیر را اجرا کنید:

npm install mongoose

در مرحله بعد، یک فایل server.js در دایرکتوری ریشه پروژه خود ایجاد کنید و بلوک کد زیر را برای ایجاد یک سرور اضافه کنید:

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 منتقل کند. این ماژول شامل روش های مورد نیاز برای ایجاد سرور می باشد.

سپس، متد createServer ماژول http را فراخوانی می کند که نمونه ای از یک سرور را ایجاد و برمی گرداند. متد createServer یک تابع callback با یک شی درخواست و پاسخ را به عنوان پارامتر می گیرد.

در مرحله بعد، کد متد listen را در نمونه سرور برگشتی فراخوانی می کند. این اجازه می دهد تا سرور شروع به گوش دادن به ترافیک در پورت داده شده کند. متد گوش دادن پس از موفقیت، یک بازخوانی – آرگومان دوم – را اجرا می کند.

در نهایت، دو دایرکتوری به نام routes و model در دایرکتوری ریشه پروژه خود ایجاد کنید. پوشه مسیرها حاوی منطق مسیریابی برای API شما خواهد بود، در حالی که مدل شامل همه چیز مربوط به پایگاه داده خواهد بود.

مرحله 2: اتصال برنامه خود به یک پایگاه داده

در server.js، mongoose را وارد کنید:

const mongoose = require("mongoose");

متد connect را در mongoose فراخوانی کنید و URI MongoDB خود را به عنوان آرگومان ارسال کنید:

mongoose.connect("MongoDB_URI")

مرحله 3: ایجاد یک مدل API

یک CRUD API برای یک برنامه وبلاگ ساده ایجاد کنید. در پوشه models خود، یک فایل 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 نگاشت می کند.

هر دو ویژگی در این مدل دارای یک نوع رشته با مجموعه مورد نیاز به true هستند. اگر بدنه درخواستی حاوی هیچ یک از ویژگی ها نباشد، پیام های خطای همراه نمایش داده می شود.

خط نهایی با فراخوانی روش مدل در mongoose یک مدل mongoose ایجاد و صادر می کند. نام مدل (Blog) را به عنوان آرگومان اول و یک طرحواره (blogSchema) را به عنوان آرگومان دوم ارسال کنید.

مرحله 4: پیاده سازی مسیریابی در برنامه شما

بدون کمک چارچوب هایی مانند Express، باید به صورت دستی منطقی برای رسیدگی به هر درخواستی که به API خود ارسال می شود ایجاد کنید.

ابتدا یک فایل blogRoutes.js در پوشه routes خود ایجاد کنید، سپس مدل وبلاگ را وارد کنید:

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

سپس یک تابع روتر ناهمزمان ایجاد کنید، req و res را به عنوان پارامتر ارسال کنید و تابع را صادر کنید:

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

این تابع شامل تمام منطق مسیریابی شما خواهد بود.

در مرحله بعد، منطق مسیریابی مسیر به مسیر را پیاده سازی خواهید کرد.

مسیرها را دریافت کنید

بلوک کد زیر را به عملکرد روتر خود اضافه کنید تا کنترل کننده مسیر GET را برای درخواست های ارسال شده به /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));
}

بلوک کد بالا url و ویژگی های متد شی درخواست را بررسی می کند. سپس تمام وبلاگ ها را از طریق روش Find در مدل mongoose (Blog) از پایگاه داده واکشی می کند.

در مرحله بعد، متد writeHead را در res، شی پاسخ، فراخوانی می کند. این روش یک هدر پاسخ را با سه آرگومان ارسال می کند: یک کد وضعیت، یک پیام وضعیت اختیاری و سرصفحه. کد وضعیت 200 نشان دهنده یک پاسخ موفقیت آمیز است و نوع محتوا برای این تماس API روی application/json تنظیم شده است.

در نهایت، با فراخوانی روش end در res، درخواست را ببندید تا مطمئن شوید که سرور هنگ نمی کند. فراخوانی به JSON.stringify شی وبلاگ را به یک رشته JSON تبدیل می کند و ارسال آن به روش پایانی آن را به عنوان بدنه پاسخ برمی گرداند.

بلوک کد زیر را به عملکرد روتر خود اضافه کنید تا کنترل کننده مسیر GET را برای یک منبع واحد پیاده سازی کنید:

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

این کد از متد تطبیق استفاده می کند که یک عبارت regex را به عنوان آرگومان می گیرد تا بررسی کند آیا آدرس اینترنتی با قالب مطابقت دارد: /api/blogs/.

سپس، با فراخوانی متد split، ویژگی id را از رشته url استخراج کنید. این متد یک الگو را به عنوان آرگومان (/) می گیرد، رشته را بر اساس الگو تقسیم می کند و یک آرایه برمی گرداند. سومین عنصر آن آرایه id است.

در نهایت، سند را با شناسه منطبق از پایگاه داده خود بازیابی کنید. اگر وجود دارد، یک کد پاسخ 200 ارسال کنید، درخواست را ببندید و وبلاگ بازیابی شده را ارسال کنید. اگر وجود ندارد، یک خطا پرتاب کنید و آن را به عنوان پاسخ در بلوک catch ارسال کنید.

مسیر POST

بلوک کد زیر را به عملکرد روتر خود اضافه کنید تا کنترل کننده مسیر 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 را پیاده سازی می کند. این جریان یک داده و یک رویداد پایانی را منتشر می کند که به شما امکان دسترسی به داده های بدنه درخواست را می دهد.

این کد به رویداد داده گوش می دهد و با تبدیل آن به رشته و الحاق آن به متغیر بدنه آن را مدیریت می کند. در پایان دهنده رویداد، یک نمونه Blog با رشته بدنه تجزیه شده ایجاد می کند. سپس وبلاگ جدید را ذخیره می کند، کد وضعیت و هدر محتوا را ارسال می کند و درخواست را می بندد.

مسیر قرار دادن

بلوک کد زیر را به عملکرد روتر خود اضافه کنید تا کنترل کننده مسیر 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 تقریباً با کنترل کننده درخواست POST یکسان است، با این تفاوت که ویژگی id را از آدرس اینترنتی استخراج می کند تا وبلاگ مربوطه را به روز کند.

حذف مسیر

بلوک کد زیر را به عملکرد روتر خود اضافه کنید تا کنترل کننده مسیر DELETE خود را پیاده سازی کنید:

// 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 خود وارد کنید و تابع روتر خود را فراخوانی کنید و req و res را به عنوان آرگومان ارسال کنید:

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

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

این به سرور شما اجازه می دهد تا درخواست ها را به درستی رهگیری و رسیدگی کند.

شما می توانید پروژه تکمیل شده را در این مخزن GitHub پیدا کنید.

با استفاده از Node.js Framework

حتی اگر امکان ایجاد یک وب API با دست وجود دارد، ممکن است کار دشواری باشد. شما باید مطمئن شوید که بسیاری از موارد لبه را پوشش داده اید و بهتر است کد شما بدون اشکال باشد.

در طول سال‌ها، توسعه‌دهندگان چارچوب‌هایی مانند ExpressJS، NestJS، Fastify و غیره ساخته‌اند تا کار را بسیار آسان‌تر کنند.

مطلب مرتبط:   نحوه ایجاد Breadcrumbs در React.js