Controller — Routing, Request, Response

~20 daq · NestJS · Boshlang'ich daraja

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: any yozdik. 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 → 200
  • POST → 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') → /users prefiks
  • @Get(), @Post() → HTTP metodlar
  • @Param() → URL parametrlar (:id)
  • @Query() → ?page=1 kabi parametrlar
  • @Body() → yuborilgan JSON ma'lumot

Keyingi dars

3-dars: Providers va Dependency Injection