Bu postimizda dastur fayllari va ularning vazifalarini ko'rib chiqamiz.

NestJSAPIThunder Client

Oldingi post

Oldingi postimizda, nest.js dasturi qanday tuziladi va unda qanday fayllar mavjudligini ko'rib chiqgan edik. Bu postimizda shu masalani chuqurroq ko'rib chiqishga harakat qilamiz.

package.json

Bu fayl node.js dasturimizning yuragi deb tushunsak ham bo'ladi, va uning tuzilishi quydagicha:

package.json
{
  "name": "test-app",
  ....
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  ....
}

Ushbu fayilmizning eng asosiy joylariga diqqatimizni qaratib o'tamiz ya'ni script qismiga.

  • build - Buyerda ko'rib turganimizdek bu bizning loyhamizni node.js da ishga tushurish uchun JavaScript kodlariga o'girib beradi, va nest start-dan farqi bu yerda ko'dimiz qanday o'girilishini hohlagancha sozlash mumkin.
  • format - Ushbu buyruq faqat dasturchilar uchun ya'ni dasturni yozayotganda iloji boricha kodimiz tushunarli bo'lishini taminlab borishimiz kerak, aks holda, bizdan keyingi dasturchilar bizning kodimizni tushunmasliklari mumkin. Shu maqsadda prettier - hamma uchun universal yechim o'ylab topishgan. Bu bilan biz shunchaki kod yozib bo'lgach uni saqlasak masaln VsCode biz uchun ushbu prettier - ni qo'llab kodimizni tuzatib beradi.
  • start - Bu buyrug'imiz bizning loyihamizda masalan dist - folderi bor bo'lsa shu folder ichidagi kodlarni ishlatib dasturni yurgizadi, bu buyruq uchun bu dist eski yoki yangi ekanligini farqi yo'q.
  • start:dev - Oldingi buyruqdan farqli bu safar dist folderini har doim yangilab turishida va demak qaysidur fayl o'zgarsa har safar serverni qayta ishga tushirib turadi.
  • start:debug - --debug - konsolga (console) ilji boricha barcha warnig yoki info habarlarini chiqarib turishini taminlaydi.
  • start:prod - Ko'rib turganimizdek, bu buyruq bizning tayyor bo'lgan va dist folder-dagi main.js fayilimizni ishga tushuradi.
  • lint - Bu buyruqning 'prettier'-dan farqi bu safar faqat kod tuzilishi emas, balkim sintaktik hatolar kabi tomonlarni ham agar xato topilsa bizni og'oxlantiradi yoki agar uning yechimi universal bo'lsa shunga o'zgaritib qo'yadi.
  • test: Bu yerda ko'rib turganimizdek biz dasturimizni yozib borar ekanmiz uni maxsus testlardan ham o'tkazib turishimiz kerak bo'ladi. Buni biz 'Jest' paketi orqali qilshimiz mumkin bo'ladi. Test haqida batafsil keyingi postlarimizda ko'rib chiqamiz.

Shu bilan qisqacha package.json haqida tushnchamizni yakunlaymiz. Ularning vazifalarini ishlatib ko'rish orqali yanada yaxshiroq tushuntirib boramiz.

Dasturni ishga tushurish

.
sh
~/test-app
pnpm run start:dev

> test-app@0.0.1 start:dev /Users/adhammuhammadjonov/test-app
> nest start --watch
[2:39:03 PM] Starting compilation in watch mode...

[2:39:04 PM] Found 0 errors. Watching for file changes.

[Nest] 27603  - 07/11/2023, 2:39:04 PM     LOG [NestFactory] Starting Nest application...
[Nest] 27603  - 07/11/2023, 2:39:04 PM     LOG [InstanceLoader] AppModule dependencies initialized +8ms
[Nest] 27603  - 07/11/2023, 2:39:05 PM     LOG [RoutesResolver] AppController {/}: +6ms
[Nest] 27603  - 07/11/2023, 2:39:05 PM     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 27603  - 07/11/2023, 2:39:05 PM     LOG [NestApplication] Nest application successfully started +1ms

Bu bilan biz serverimizni ishga tushurib oldig va agar biz quydagi buyruqni o'z terminalimizga yozadigan bo'lsak:

.
sh
~/test-app
#
curl http://localhost:3000
Hello World!

Demak biz ushbu addressni eshtib turgan serverga GET - olish so'rovini yuborganimzda bizga Hello World! teksti bilan javob qaytardi.

Thunder Client

Bizlarga bu VsCode extension juda ham foydali bo'ladi, chunki biz har xil qiyinlikdagi so'rovlarni serverga yuboramiz.

VsCode Thunder Client

VsCode Thunder Client

Biz uni VsCode'ga qo'shib olganimizdan so'ng bizning task-bar'da Thunder Client logoso paydo bo'ladi.

Thunde Client VsCode

Thunde Client VsCode

Va tepadagi rasimdan ko'rishimiz mumkinki, New Request - Yangi so'rov tugmasidan foydalanib biz serverimizga yangi so'rov yuborishimiz mumkin bo'ladi.

VsCode Thunder Client sending new request

VsCode Thunder Client sending new request

Fayllar tuzilishi

main.ts

Eng avvalo bizning dasturga kirish nuqtasi bo'lmish main.ts fayilini ko'rib chiqsak.

NestJs folders

NestJs folders

Va bu faylning tarkibiga qarasak, biz quydagilarni ko'rishimiz mumkin bo'ladi:

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  await app.listen(3000)
}
bootstrap()

Bu fayilimiz NestFactory-ni import qilib olgan oddiy bootstrap deb nomlangan funksiyamizda yangi app - dastur yaratib olgach u qaysi Network port- dan foydalanishni aytmoqda. va shu faylimiz oxirida ushbu bootstrap funksiyamizni chaqarib qo'yamiz.

app.module.ts

Agar biz diqqat bilan qarasak, biz NestJS yangi app yaratish uchun AppModule-dan foydalanmoqda.

src/app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Har bir NestJS dasturida eng kamida bitta root - iltiz module bo'lishi shart hisoblanadi. Va ushbu modullar o'zaro bog'liqligiga qarab NestJS dastur tuzlmasini yaratadi:

NestJS modules

NestJS modules

AppModule-da controllers - o'zaro bog'liqligini quydagi chizma orqali tushunib olishimiz mumkin bo'ladi: NestJS AppModule

NestJS AppModule

NestJS modullari,controller,service-lar

Endi ushbu fayillarni ko'rib chiqasak, modullar qanday yaratiladi:

.
sh
~/test-app
nest generate module Users
# yoki qisqaroq shakilda: nest g module Users
CREATE src/users/users.module.ts (82 bytes)
UPDATE src/app.module.ts (312 bytes)

Ko'rib turganimizdek nest buyrug'i orqali users.module.ts fayli qo'shildi va bizning app.module.ts fayilimiz yangilanidi:

src/app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
import { UsersModule } from './users/users.module'

@Module({
  imports: [UsersModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Agar biz src folder'ni ko'radigan bo'lsak yangi users folderi qo'shilganligini ko'rishimiz mumkin:

.
sh

├── src/
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── main.ts
│   └── users/
│       └── users.module.ts

Va biz yangi modulimizni tarkibi quydagicha bo'lganligini ko'rishimiz mumkin bo'ladi:

src/users/users.module.ts
import { Module } from '@nestjs/common'

@Module({})
export class UsersModule {}

Huddi shu tartibda biz ushbu modulga uning controllerini ham qo'shib olishimiz mumkin bo'ladi:

.
sh
~/test-app
nest g controller users
CREATE src/users/users.controller.spec.ts (485 bytes)
CREATE src/users/users.controller.ts (99 bytes)
UPDATE src/users/users.module.ts (170 bytes)

Endigi navbatda biz yangi users.controller qo'shdik va users.module.ts ni yangiladik:

src/users/users.module.ts
import { Module } from '@nestjs/common'
import { UsersController } from './users.controller'

@Module({
  controllers: [UsersController],
})
export class UsersModule {}

Endigi navbatda biz ushbu users modulega provider - service qo'shib olamiz:

.
sh
~/test-app
nest g service users
CREATE src/users/users.service.spec.ts (453 bytes)
CREATE src/users/users.service.ts (89 bytes)
UPDATE src/users/users.module.ts (248 bytes)
.
sh
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── main.ts
└── users
    ├── users.controller.spec.ts
    ├── users.controller.ts
    ├── users.module.ts
    ├── users.service.spec.ts
    └── users.service.ts

Agar biz e'tibor beradigan bo'lsak nest buyrug'i bilan o'zimizga kerak faylarni qo'shganimizda bir xil tartibdagi ko'rinishda ushbu fayillar qo'shilmoqda va agar siz hohlasangiz boshqacha ham qilishingiz mumkin, lekin bu yo'q bilan va bu ko'rinishda dasturimizni shakllantirish ko'p vaqtimizni tejab beradi va standart shakildagi dastur-kodlarini yaratishga yordam beradi.

Bularning har birni alohida yaratmasdan bitta yaratib olish ham mumkin:

.
sh
~/test-app
 nest g resource products
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? Yes
CREATE src/products/products.controller.spec.ts (596 bytes)
CREATE src/products/products.controller.ts (957 bytes)
CREATE src/products/products.module.ts (268 bytes)
CREATE src/products/products.service.spec.ts (474 bytes)
CREATE src/products/products.service.ts (651 bytes)
CREATE src/products/dto/create-product.dto.ts (33 bytes)
CREATE src/products/dto/update-product.dto.ts (181 bytes)
CREATE src/products/entities/product.entity.ts (24 bytes)
UPDATE package.json (1986 bytes)
UPDATE src/app.module.ts (389 bytes)
 Packages installed successfully.

ushbu buyruq bilan biz bittada module,controller va servislarimizni yaratib olishimiz mumkin bo'ladi. Natijada quyida ko'radigan bo'lsak yana bitta products folderi qo'shilgan bo'ladi:

.
sh
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── main.ts
├── products
│   ├── dto
│   │   ├── create-product.dto.ts
│   │   └── update-product.dto.ts
│   ├── entities
│   │   └── product.entity.ts
│   ├── products.controller.spec.ts
│   ├── products.controller.ts
│   ├── products.module.ts
│   ├── products.service.spec.ts
│   └── products.service.ts
└── users
    ├── users.controller.spec.ts
    ├── users.controller.ts
    ├── users.module.ts
    ├── users.service.spec.ts
    └── users.service.ts

Lekin biz ko'rishimiz mumkin-ki bu yerda boshqa yana qo'shimcha fayillar ham mavjuda ya'ni: dto - fayillari. Bu fayillarni biz so'rov shaklini boshqarishda ishlatamiz. Ya'ni so'rovda nimalar bo'lishi shart va nimalar bo'lishi majburiy emasligi haioda. Bu fayillarni keyingi postlarda ko'rib chiqamiz.

generate resource - buyrug'ini ishlatishga shoshilmang, chunki tepada ko'rib turganimizdek, u bizqa ko'plab qo'shimchalarni beradi va bizlar hali ularni tushunishga qiynalishimiz mumkin.

Xulosa

Ushbu postimizda nestjs dasturidagi fayillarni va ularning vazifalarini qisman ko'rib chiqdik, va nestjs dasturini ishlatib ko'rdik, va birinchi so'rovimizni yubordik. Keyingi postlarimizda bu ko'rilgan ma'lumotlarni yanada chuqurlashitirib boramiz

Keynig post: Coming soon...