Node.js va Express’da REST API qanday yaratiladi
Amaliyot4 daqInnovialabs tahririyati
Qisqacha
Express loyihasini yarating, kodni marshrutlar, kontrollerlar va ma’lumotlar qatlamiga ajrating, kiruvchi ma’lumotlarni sxema bilan tekshiring, xatolarni bitta middleware’da qayta ishlang va endpoint’larni HTTP-klient bilan sinang.
Qisqa reja
Express’dagi REST API besh qismdan yig‘iladi:
- Ilova — Express’ni yaratish va middleware’larni ulash.
- Marshrutlar — qaysi URL va metodlar mavjud.
- Kontrollerlar — so‘rov bilan nima qilish kerak.
- Ma’lumotlar qatlami — bazaga so‘rovlar.
- Xatolarni qayta ishlash — nosozlikda yagona javob formati.
Quyida PostgreSQL bilan vazifalar ro‘yxati (/tasks) uchun minimal API.
1-qadam. Loyihani tayyorlash
mkdir tasks-api && cd tasks-api
npm init -y
npm install express pg zod dotenv
import ishlatish uchun package.json’ga "type": "module" qo‘shing. Tuzilma:
src/
app.js
db.js
routes/tasks.js
controllers/tasks.js
.env
Ulanish satrini .env’da saqlang: DATABASE_URL=postgres://user:pass@localhost:5432/tasks. Bu fayl Git’ga commit qilinmaydi.
2-qadam. Bazaga ulanish
// src/db.js
import pg from "pg";
export const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
Jadval:
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
done BOOLEAN NOT NULL DEFAULT false
);
Ulanishlar puli har bir so‘rov uchun yangisini ochmasdan, ulanishlarni qayta ishlatadi.
3-qadam. Kontrollerlar va validatsiya
Kontroller so‘rovni qabul qiladi, ma’lumotlarni tekshiradi va bazaga murojaat qiladi. Validatsiya uchun zod qulay.
// src/controllers/tasks.js
import { z } from "zod";
import { pool } from "../db.js";
const taskSchema = z.object({ title: z.string().min(1).max(200) });
export async function listTasks(req, res, next) {
try {
const { rows } = await pool.query("SELECT * FROM tasks ORDER BY id");
res.json(rows);
} catch (err) {
next(err);
}
}
export async function createTask(req, res, next) {
const parsed = taskSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: "Validation failed", details: parsed.error.issues });
}
try {
const { rows } = await pool.query(
"INSERT INTO tasks (title) VALUES ($1) RETURNING *",
[parsed.data.title]
);
res.status(201).json(rows[0]);
} catch (err) {
next(err);
}
}
$1’ga e’tibor bering: bu parametrlangan so‘rov, u SQL-in’yeksiyalardan himoya qiladi. Foydalanuvchi ma’lumotlarini hech qachon satrlarni ulash orqali SQL’ga qo‘ymang.
4-qadam. Marshrutlar
// src/routes/tasks.js
import { Router } from "express";
import { listTasks, createTask } from "../controllers/tasks.js";
export const tasksRouter = Router();
tasksRouter.get("/", listTasks);
tasksRouter.post("/", createTask);
5-qadam. Ilova va xatolarni qayta ishlash
// src/app.js
import "dotenv/config";
import express from "express";
import { tasksRouter } from "./routes/tasks.js";
const app = express();
app.use(express.json());
app.use("/tasks", tasksRouter);
app.use((req, res) => res.status(404).json({ error: "Not found" }));
app.use((err, req, res, next) => {
console.error(err);
res.status(500).json({ error: "Internal server error" });
});
app.listen(3000, () => console.log("API on http://localhost:3000"));
Express to‘rtta argumentli middleware’ni xatolar ishlovchisi deb hisoblaydi. U oxirida turishi kerak. Klientga umumiy xabar qaytaring, tafsilotlarni esa logga yozing.
6-qadam. HTTP-klient bilan tekshirish
node src/app.js ni ishga tushiring va endpoint’larni curl, Postman, Insomnia yoki muharrirdagi REST Client orqali tekshiring:
curl -X POST http://localhost:3000/tasks \
-H "Content-Type: application/json" \
-d '{"title":"Hujjatlarni yozish"}'
curl http://localhost:3000/tasks
Salbiy holatlarni ham tekshiring: bo‘sh title, noto‘g‘ri JSON, mavjud bo‘lmagan yo‘l. Avtotestlar uchun test vositasi bilan supertest mos keladi.
Production’dan oldin nimalarni qo‘shish kerak
Minimal API ishlaydi, lekin haqiqiy loyihaga odatda yana bir nechta narsa kerak bo‘ladi:
- CRUD’ning qolgan operatsiyalari:
GET /tasks/:id,PATCH /tasks/:id,DELETE /tasks/:id, yozuv topilmasa404javobi bilan. - Paginatsiya: butun jadvalni bir martada bermaslik uchun
limitvaoffsetparametrlari yoki kursor. - Autentifikatsiya: JWT yoki sessiyalar, shuningdek aniq yozuvlarga kirish huquqini tekshirish.
- Xavfsizlik: helmet orqali sarlavhalar, CORS sozlamalari, so‘rovlar chastotasini cheklash.
- Loglash:
console.logo‘rniga tuzilmali loglar, masalan, pino orqali. - Migratsiyalar: baza sxemasi qo‘lda emas, versiyalangan migratsiyalar orqali o‘zgarishi kerak.
- Versiyalash:
/v1prefiksi eski klientlarni buzmasdan API’ni o‘zgartirishni osonlashtiradi.
Keng tarqalgan xatolar
- Butun mantiq bitta faylda. Marshrutlar, kontrollerlar va ma’lumotlarga kirishni ajrating.
- Validatsiya yo‘q. Klientdan kelgan har qanday ma’lumotni ishonchsiz deb hisoblang.
- Noto‘g‘ri statuslar. Yaratish —
201, kiritish xatosi —400, topilmadi —404. - Koddagi sirlar. Parollar va kalitlar — faqat muhit o‘zgaruvchilarida.
- Javobdagi xato steki. Bu amalga oshirish tafsilotlarini oshkor qiladi.