Skip to content

2. Struktur NestJS

1. Struktur Folder NestJS

Alt text

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

terminal
npm run start:dev

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 - logic
  • app.module.ts adalah configurasi yang menampung Controller dan Service
  • app.controller.spec.ts adalah Unit Testing untuk controller yang digunakan untuk melakukan test pada controller
  • main.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 HTTP
  • jest-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

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"
  }
}
file konfigurasi pada environment NestJS memuat file-file berikut.

  • 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 pada terminal dengan npm 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

Alt text

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:

Alt text

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

Alt text

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

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();
Alt text

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.

app.controller.ts
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';
  }
}
pada contoh di atas kita membuat routing pada url http://localhost:5002/belajar-route yang akan menampilkan pesan Belajar-Routing, sehingga akan tampil seperti gambar di bawah

Alt text

Untuk materi routing yang lain nya kita akan bahas pada materi selanjutnya.