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:
{
"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, vanest 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 maqsaddaprettier
- hamma uchun universal yechim o'ylab topishgan. Bu bilan biz shunchaki kod yozib bo'lgach uni saqlasak masalnVsCode
biz uchun ushbuprettier
- ni qo'llab kodimizni tuzatib beradi.start
- Bu buyrug'imiz bizning loyihamizda masalandist
- folderi bor bo'lsa shu folder ichidagi kodlarni ishlatib dasturni yurgizadi, bu buyruq uchun budist
eski yoki yangi ekanligini farqi yo'q.start:dev
- Oldingi buyruqdan farqli bu safardist
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 barchawarnig
yokiinfo
habarlarini chiqarib turishini taminlaydi.start:prod
- Ko'rib turganimizdek, bu buyruq bizning tayyor bo'lgan vadist
folder-dagimain.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
~/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:
~/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.
Biz uni VsCode'ga qo'shib olganimizdan so'ng bizning task-bar'da Thunder Client logoso paydo bo'ladi.
Va tepadagi rasimdan ko'rishimiz mumkinki, New Request
- Yangi so'rov tugmasidan foydalanib biz serverimizga yangi so'rov yuborishimiz mumkin bo'ladi.
Fayllar tuzilishi
main.ts
Eng avvalo bizning dasturga kirish nuqtasi bo'lmish main.ts
fayilini ko'rib chiqsak.
Va bu faylning tarkibiga qarasak, biz quydagilarni ko'rishimiz mumkin bo'ladi:
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.
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:
AppModule
-da controllers
- o'zaro bog'liqligini quydagi chizma orqali tushunib olishimiz mumkin bo'ladi:
NestJS modullari,controller,service-lar
Endi ushbu fayillarni ko'rib chiqasak, modullar qanday yaratiladi:
~/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:
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:
├── 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:
import { Module } from '@nestjs/common'
@Module({})
export class UsersModule {}
Huddi shu tartibda biz ushbu modulga uning controllerini ham qo'shib olishimiz mumkin bo'ladi:
~/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:
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:
~/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)
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:
~/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:
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...