NestJS

NestJS nima?

Agar siz Node.js va Express bilan bir necha loyiha yozgan bo'lsangiz, ehtimol bitta muammoga duch kelgansiz: loyiha kattalashgani sari kod tartibsiz bo'lib boradi. Route'lar, biznes-logika va ma'lumotlar bazasi so'rovlari bir joyga aralashib ketadi. NestJS aynan shu muammoni hal qilish uchun yaratilgan โ€” u sizga qat'iy va tushunarli arxitektura, TypeScript'ning to'liq kuchi va tayyor infratuzilma beradi.

Ushbu bob siz allaqachon Node.js, Express va TypeScript asoslarini bilasiz deb faraz qiladi. NestJS bularning ustiga qurilgan, shuning uchun ularni tushunmasangiz, oldingi boblarga qaytib o'tishni tavsiya qilamiz.

NestJS nima va u qanday muammoni hal qiladi?

NestJS (odatda shunchaki Nest deb ataladi) โ€” bu Node.js muhitida server tomonidagi ilovalarni yaratish uchun mo'ljallangan framework. U TypeScript'da yozilgan va TypeScript bilan ishlashga to'liq moslashtirilgan (garchi sof JavaScript'da ham yozish mumkin bo'lsa-da).

Express o'zi juda minimalist โ€” u sizga faqat route va middleware beradi, qolgani sizning ixtiyoringizda. Bu erkinlik kichik loyihalar uchun yaxshi, lekin katta jamoada har kim o'z uslubida yozsa, loyiha boshqarib bo'lmas holga keladi. NestJS esa qarama-qarshi yondashuvni tanlaydi: u fikrli (opinionated) framework โ€” ya'ni kodni qanday tashkil qilishni aniq belgilaydi.

NestJS Express ustida qanday ishlaydi?

Bu tushunish uchun juda muhim nuqta: NestJS Express'ni almashtirmaydi, balki uning ustiga qurilgan qatlamdir. Standart holatda NestJS ichida haqiqiy Express ilovasi ishlaydi. Ya'ni siz yozgan controller'lar oxir-oqibat Express route'lariga aylanadi, guard'lar va interceptor'lar esa Express middleware'lariga o'xshab ishlaydi.

Bu shuni anglatadiki, Express ekotizimidagi ko'plab paketlar (masalan, helmet, cookie-parser) NestJS bilan ham ishlaydi. Kerak bo'lsa, siz hatto asosiy Express request va response obyektlariga to'g'ridan-to'g'ri kirishingiz mumkin.

NestJS shuningdek Express o'rniga Fastify adapterini ishlatishga imkon beradi โ€” bu tezroq HTTP kutubxona. Muhimi: sizning controller va service kodingiz o'zgarmaydi, faqat pastdagi "dvigatel" almashadi. Bu abstraksiya NestJS'ning kuchli tomonlaridan biri.

Shunday qilib NestJS'ni Express uchun tuzilma va qoidalar to'plami deb tasavvur qiling. U sizga "qanday yozish kerak"ligini aytadi, lekin ostida siz bilgan Express texnologiyasi ishlaydi.

Angular'dan ilhom: nega bu muhim?

NestJS'ning arxitekturasi Angular (frontend framework) ta'sirida shakllangan. Agar siz Angular bilan tanish bo'lsangiz, NestJS'dagi modul, servis, dekorator va Dependency Injection tushunchalari juda tanish tuyuladi.

Bu tanlov tasodifiy emas. Angular yirik jamoalarda katta ilovalarni yillar davomida barqaror tarzda rivojlantirish uchun mo'ljallangan. Xuddi shu maqsad NestJS oldida ham turadi โ€” backend tomonda uzoq muddatli, kengaytiriladigan va sinovdan o'tkaziladigan kod yozish. Frontend va backend bir xil arxitektura tamoyillariga tayangani jamoa uchun bilim almashishni osonlashtiradi.

Node.js CLI orqali o'rnatish

NestJS bilan ishlashning eng qulay yo'li โ€” uning rasmiy buyruq qatori vositasi, ya'ni Nest CLI orqali. U yangi loyihani tayyor tuzilma bilan yaratadi va kod generatsiya qilishni osonlashtiradi. Uni global o'rnatamiz:

# Nest CLI'ni global o'rnatish:
npm install -g @nestjs/cli

# O'rnatilganini tekshirish:
nest --version

Endi yangi loyiha yaratamiz. nest new buyrug'i papka yaratadi, barcha kerakli paketlarni o'rnatadi va boshlang'ich kodni tayyorlaydi:

# Yangi loyiha yaratish:
nest new mening-ilovam

# CLI paket menejerini so'raydi (npm, yarn yoki pnpm) โ€” birini tanlang.

# Loyiha papkasiga o'tib, uni ishga tushirish:
cd mening-ilovam
npm run start:dev

start:dev rejimi watch bilan ishlaydi: siz faylni saqlagan zahoti server avtomatik qayta yuklanadi. Ilova standart holatda http://localhost:3000 manzilida ochiladi. Brauzerda ushbu manzilni ochsangiz, oddiy "Hello World!" javobini ko'rasiz.

Nest CLI faqat loyiha yaratish uchun emas. Keyingi darslarda ko'ramizki, u nest generate (qisqacha nest g) orqali modul, controller, service kabi qismlarni bir buyruq bilan yaratib beradi va ularni loyihaga avtomatik ulaydi.

Loyihaning boshlang'ich tuzilishi

nest new yaratgan loyihada eng muhim fayllar src/ papkasida joylashadi. Ular bilan keyingi darslarda batafsil tanishamiz, lekin hozircha umumiy manzarani ko'ramiz:

mening-ilovam/
  src/
    app.controller.ts       # Oddiy controller (route'lar)
    app.controller.spec.ts  # Controller uchun test
    app.service.ts          # Biznes-logika (service)
    app.module.ts           # Ildiz modul โ€” hammani bog'laydi
    main.ts                 # Kirish nuqtasi (ilova shu yerdan boshlanadi)
  test/                     # e2e testlar
  package.json
  tsconfig.json
  nest-cli.json

Kirish nuqtasi โ€” bu main.ts. Uni ochsak, NestJS ilovasi qanday boshlanishini ko'ramiz. Bu Express'dagi app.listen() ga o'xshaydi, lekin biroz boshqacharoq:

// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  // Ildiz moduldan ilova yaratamiz:
  const app = await NestFactory.create(AppModule);

  // 3000-portda tinglashni boshlaymiz:
  await app.listen(3000);
}
bootstrap();

E'tibor bering: Express'da biz express() chaqirib, so'ng route'larni qo'lda qo'shardik. NestJS'da esa biz faqat ildiz modulni (AppModule) beramiz, qolgani avtomatik yig'iladi. Bu modulli arxitekturaning birinchi ko'rinishi.

NestJS qachon kerak va qachon ortiqcha?

NestJS kuchli vosita, lekin har bir loyiha uchun to'g'ri tanlov emas. Uni tanlashda quyidagilarni hisobga oling:

NestJS mos keladigan holatlar

NestJS ortiqcha bo'lishi mumkin bo'lgan holatlar

NestJS'da o'rganish egri chizig'i (learning curve) mavjud: dekoratorlar, DI va modullar tushunchalarini o'zlashtirish vaqt oladi. Kichik loyiha uchun bu ortiqcha murakkablik bo'lishi mumkin. Lekin loyiha o'sishi ehtimoli bo'lsa, boshidanoq NestJS tanlash keyinchalik qayta yozishdan qutqaradi.

Xulosa