2. Struktur NestJS
1. Struktur Folder NestJS
Pada saat pertama kali install Nest JS di project , maka akan mendapatkan seperti gambar di atas.
dist
folder dist merupakan hasil compile dari typescript ke javascript dari folder src , folder dist akan muncul ketika kita jalankan
node_module
node_module
berisi depedencies
yang di install pada project kita. Ukuran folder node_module
besar tergantung banyak libary yang di install. folder node_module
tidak ikut di push ke githab/gitlab.
src
folder src
adalah lokasi dimana kita akan melakuakn proses koding, di dalam folder src
secara default terdapat beberapa file
- `app.controller.ts`` yang digunakan sebagai controller dan juga sebagai Routing yang berhubungan langsung dengan client
app.service.ts
adalah service yang di panggil oleh Controller dan berisi logic - logicapp.module.ts
adalah configurasi yang menampung Controller dan Serviceapp.controller.spec.ts
adalah Unit Testing untuk controller yang digunakan untuk melakukan test pada controllermain.ts
adalah file yang menjalankan Nest JS diatas Express JS maupun Fastify
test
Folder test merupakan folder yang berisi file untuk melakukan testing, secara default folder test terdapat file
app.e2e-spec.ts
adalah file untuk melakukan End to End Testing terhadap Controller melalui HTTPjest-e2e.json
adalah file configurasi End to End Testing yang menggunakan Jest secara defaultnya.
eslintrc.js
file eslintrc.js
merupakan default dari eslint
, dimana kita dapat mengkonfigurasi sesuai kebutuhan
.gitignore
.gitignore
merupakan file untuk mendefiniskan file atau folder mana saya yang tidak akan kita push ke dalam github/gitlab
nest-cli.json merupakan file konfigurasi untuk nest cli
package.json
{
"name": "backend-nestjs",
"version": "0.0.1",
"description": "",
"author": "",
"private": true,
"license": "UNLICENSED",
"scripts": {
"prebuild": "rimraf dist",
"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"
},
"dependencies": {
"@nestjs-modules/mailer": "^1.9.1",
"@nestjs/common": "^9.0.0",
"@nestjs/config": "^3.0.0",
"@nestjs/core": "^9.0.0",
"@nestjs/jwt": "^10.1.0",
"@nestjs/mapped-types": "^2.0.2",
"@nestjs/passport": "^10.0.0",
"@nestjs/platform-express": "^9.0.0",
"@nestjs/serve-static": "^4.0.0",
"@nestjs/typeorm": "^10.0.0",
"bcrypt": "^5.1.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.0",
"handlebars": "^4.7.7",
"mysql2": "^3.5.2",
"nodemailer": "^6.9.4",
"passport": "^0.6.0",
"passport-jwt": "^4.0.1",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.2.0",
"typeorm": "^0.3.17"
},
"devDependencies": {
"@nestjs/cli": "^9.0.0",
"@nestjs/schematics": "^9.0.0",
"@nestjs/testing": "^9.0.0",
"@types/bcrypt": "^5.0.0",
"@types/express": "^4.17.13",
"@types/jest": "28.1.8",
"@types/multer": "^1.4.7",
"@types/node": "^16.0.0",
"@types/nodemailer": "^6.4.9",
"@types/passport-jwt": "^3.0.9",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^5.0.0",
"@typescript-eslint/parser": "^5.0.0",
"eslint": "^8.0.1",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "28.1.3",
"prettier": "^2.3.2",
"source-map-support": "^0.5.20",
"supertest": "^6.1.3",
"ts-jest": "28.0.8",
"ts-loader": "^9.2.3",
"ts-node": "^10.0.0",
"tsconfig-paths": "4.1.0",
"typescript": "^4.7.4"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
dependencies
berisi library-libary yang diperlukan dalam menjalankan aplikasi baik pada mode production maupun development.devDependencies
berisi library-libary yang diperlukan dalam menjalankan aplikasi pada mode development.scripts
digunakan untuk membuat aliases perintah tertentu padaterminal
dengannpm run nama_script
.- dan konfigurasi lain yang dibutuhkan.
2. Konsep Modular dan Service Pattern
Apa itu Modular?
Pada NestJS, modular
mengacu pada pendekatan organisasi kode yang membagi aplikasi menjadi modul-modul terpisah. Pendekatan ini membantu dalam mengatur, memisahkan, dan mempermudah pengembangan aplikasi yang lebih kompleks.
Penamaan Module tidak terbatas, dan kita bisa menyesuaikan dengan kebutuhan dan di dalam module bisa ada module lain dan seterusnya.
Berikut ini adalah contoh gambar Module
Pada gambar diatas, terlihat bahwa module bisa memiliki child module lain, dan setiap module bisa berinteraksi dengan module lain sehingga setiap module bisa menggunakan service dari module lain seperti gambar di bawah ini:
Apa itu Service Pattern?
Service Pattern pada nestjs adalah bahwa setiap module memili Module, Controller, dan Service. Selain Pattern tersebut kita juga dapat membuat pattern lain sesuai dengan kebutuhan
Pada gambar diatas terlihat bahwa pola di dalam module bisa berbeda - beda, misal ada module yang digunakan untuk Routing dengan menggunakan Controller dan ada juga Module yang diginakan tanpa Controller
Mengubah port Default
Secata default aplikasi nestjs akan berjalan pada port 3000 , namun kita dapat merubah port default dari aplikasi nestjs dengan port lain.
untuk merubah port default kita bisa berubah pada file main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(5002); // ubah dari 3000 menjadi 5002
}
bootstrap();
3. Basic Routing pada NestJS
Pada contoh sebelumnya kita sudah mencoba routing default pada url http://localhost:5002. Selanjutkan kita akan coba untuk membuat routing sederhana pada aplikasi nestjs.
Routing pada NestJs sangat mudah, yaitu pada file controller pada setiap module.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get('belajar-route')
getHello2(): string {
return 'Belajar Routing';
}
}
http://localhost:5002/belajar-route
yang akan menampilkan pesan Belajar-Routing, sehingga akan tampil seperti gambar di bawah
Untuk materi routing yang lain nya kita akan bahas pada materi selanjutnya.