Controller — Routing, Request, Response
Controller nima?
Tasavvur qiling: siz restoranda o'tiribsiz. Ofitsiant keladi, buyurtmangizni qabul qiladi, oshxonaga yetkazadi va tayyor taomni sizga olib keladi. Ofitsiant hech narsa pishirmaydi — u faqat vositachi.
NestJS da Controller aynan shu ofitsiant rolini o'ynaydi.
Foydalanuvchi brauzerdan so'rov yuboradi → Controller qabul qiladi → Service ga uzatadi → natijani foydalanuvchiga qaytaradi. Controller o'zi hech qanday biznes logika yozmaydi. Uning ishi faqat — qabul qilish va qaytarish.
Birinchi Controller
Keling, avval CLI yordamida controller yaratamiz:
nest g co users --no-spec
--no-spec — test faylini yaratmaslik uchun. Agar qo'shmasangiz, users.controller.spec.ts ham yaratiladi — bu test fayli, hozircha kerak emas.
CLI avtomatik bitta fayl yaratadi:
src/
└── users/
└── users.controller.ts
Va users.module.ts dagi controllers massiviga avtomatik qo'shadi.
users.controller.ts faylini oching:
import { Controller, Get } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get()
findAll() {
return "Bu yerda barcha foydalanuvchilar ro'yxati bo'ladi";
}
}
Bu oddiy ko'rinsa ham, ichida juda ko'p narsa bor. Keling, birma-bir ko'ramiz.
@Controller decorator
@Controller("users")
export class UsersController {}
@Controller('users') — bu decorator NestJS ga shuni aytadi: "bu classdagi barcha route lar /users dan boshlanadi".
Ya'ni siz /users ga so'rov yuborsangiz — NestJS bu controllerni topadi. /products ga yuborsangiz — boshqa controllerni qidiradi.
HTTP metodlar — @Get, @Post, @Put, @Delete
HTTP da bir nechta metod bor. Har birining o'z maqsadi bor:
| Metod | Decorator | Maqsad |
|---|---|---|
| GET | @Get() |
Ma'lumot olish |
| POST | @Post() |
Yangi ma'lumot yaratish |
| PUT | @Put() |
Ma'lumotni to'liq yangilash |
| PATCH | @Patch() |
Ma'lumotni qisman yangilash |
| DELETE | @Delete() |
Ma'lumot o'chirish |
Keling, bularni amalda ko'ramiz:
import {
Controller,
Get,
Post,
Put,
Delete,
Param,
Body,
} from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get()
findAll() {
return "Barcha foydalanuvchilar"; // GET /users
}
@Post()
create() {
return "Yangi foydalanuvchi yaratildi"; // POST /users
}
@Put(":id")
update(@Param("id") id: string, @Body() body: any) {
return "Foydalanuvchi yangilandi"; // PUT /users/1
}
@Delete(":id")
remove(@Param("id") id: string) {
return "Foydalanuvchi o'chirildi"; // DELETE /users/1
}
}
Route parametrlar — @Param
Ko'pincha URL da ma'lum bir foydalanuvchini ko'rsatish kerak bo'ladi. Masalan /users/5 — 5-raqamli foydalanuvchi. Bu 5 — route parametr.
import { Controller, Get, Param } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get(":id")
findOne(@Param("id") id: string) {
return `${id}-raqamli foydalanuvchi`;
}
}
:id — bu NestJS ga "URL da biror qiymat keladi, uni id deb ataymiz" deydi. @Param('id') esa o'sha qiymatni method parametriga yuklaydi.
Brauzerda http://localhost:3000/users/42 ga kirsangiz — 42-raqamli foydalanuvchi ko'rasiz.
Bir nechta parametr ham bo'lishi mumkin:
@Get(':userId/posts/:postId')
findPost(
@Param('userId') userId: string,
@Param('postId') postId: string,
) {
return `${userId}-foydalanuvchining ${postId}-maqolasi`;
}
Query parametrlar — @Query
Ba'zan URL da ? bilan qo'shimcha ma'lumot yuboriladi. Masalan /users?page=2&limit=10. Bular — query parametrlar.
import { Controller, Get, Query } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get()
findAll(@Query("page") page: number, @Query("limit") limit: number) {
return `${page}-sahifa, har sahifada ${limit} ta`;
}
}
http://localhost:3000/users?page=2&limit=10 ga kirsangiz — 2-sahifa, har sahifada 10 ta ko'rasiz.
Request body — @Body
Foydalanuvchi yangi ma'lumot yuborayotganda — masalan, ro'yxatdan o'tayotganda — u ism, email, parol yuboradi. Bu ma'lumotlar request body da keladi.
import { Controller, Post, Body } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Post()
create(@Body() body: any) {
console.log(body);
return `${body.name} nomli foydalanuvchi yaratildi`;
}
}
Postman yoki frontend dan quyidagi JSON yuborsangiz:
{
"name": "Jasur",
"email": "jasur@example.com"
}
body.name — Jasur, body.email — jasur@example.com bo'ladi.
💡 Hozircha
body: anyyozdik. Bu yaxshi emas — keyinchalik DTO darsida buni to'g'ri qilishni o'rganamiz. DTO orqali kelayotgan ma'lumotni tekshirib, xato bo'lsa foydalanuvchiga aniq xabar berasiz.
Status code va Response
Odatda NestJS avtomatik status code qaytaradi:
GET,PUT,PATCH,DELETE→ 200POST→ 201
Lekin siz buni o'zingiz ham belgilashingiz mumkin:
import { Controller, Get, HttpCode, HttpStatus } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get()
@HttpCode(HttpStatus.OK) // 200
findAll() {
return "Foydalanuvchilar";
}
@Post()
@HttpCode(HttpStatus.CREATED) // 201
create() {
return "Yaratildi";
}
}
HttpStatus — bu NestJS ning qulay enum i. Raqam yozish o'rniga HttpStatus.OK, HttpStatus.NOT_FOUND kabi o'qilishi qulay nom ishlatiladi.
Hammasi birgalikda
Keling, to'liq bir controller yozamiz:
import {
Controller,
Get,
Post,
Put,
Delete,
Param,
Query,
Body,
HttpCode,
HttpStatus,
} from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get()
findAll(@Query("page") page = 1, @Query("limit") limit = 10) {
return `${page}-sahifa, ${limit} ta foydalanuvchi`;
}
@Get(":id")
findOne(@Param("id") id: string) {
return `${id}-foydalanuvchi topildi`;
}
@Post()
@HttpCode(HttpStatus.CREATED)
create(@Body() body: any) {
return `${body.name} yaratildi`;
}
@Put(":id")
update(@Param("id") id: string, @Body() body: any) {
return `${id}-foydalanuvchi yangilandi`;
}
@Delete(":id")
remove(@Param("id") id: string) {
return `${id}-foydalanuvchi o'chirildi`;
}
}
Mana shu — to'liq CRUD uchun controller. Hali Service bilan ulashilmagan, lekin tuzilish shu ko'rinishda bo'ladi.
Xulosa
Controller — bu NestJS dagi "eshik". Tashqaridan kelgan barcha so'rovlar aynan shu yerdan kiradi. Controller ning ishi oddiy: qabul qilish, kerakli ma'lumotni olish va javob qaytarish. Biznes logika esa — bu keyingi darsimizning mavzusi.
Eslab qoling:
@Controller('users')→/usersprefiks@Get(),@Post()→ HTTP metodlar@Param()→ URL parametrlar (:id)@Query()→?page=1kabi parametrlar@Body()→ yuborilgan JSON ma'lumot
Keyingi dars
3-dars: Providers va Dependency Injection