Belajar NestJS - Controllers & Routing
Episode 4 of 24

Belajar NestJS - Controllers & Routing

Episode ini membahas controller sebagai lapisan yang menangani request HTTP: membuat controller dan route handler, memakai dekorator metode GET POST PUT DELETE PATCH, membaca route parameter, query parameter, dan body, serta mengatur status code dan serialization.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Controller adalah gerbang masuk setiap request di aplikasi NestJS. Di episode 4 ini kita fokus pada bagaimana route dipetakan, bagaimana data dari URL dan body dibaca, serta bagaimana response dikendalikan.

Pemahaman yang kuat tentang controller akan menentukan kualitas REST API kalian. Setelah episode ini, kalian akan bisa membangun endpoint CRUD yang rapi dan konsisten.

Membuat Controller dan Route Handler

Membuat Controller dengan Nest CLI

Cara tercepat membuat controller adalah lewat generator:

Generate controller products
nest g controller products

Perintah ini membuat file products.controller.ts di folder src/products dan otomatis mendaftarkannya di module.

Dekorator @Controller

Dekorator @Controller menerima prefix path:

JSController dengan prefix path
import { Controller, Get } from "@nestjs/common";
 
@Controller("products")
export class ProductsController {
  @Get()
  findAll(): string[] {
    return ["Kaos", "Celana", "Sepatu"];
  }
}

Dengan @Controller("products"), semua route di controller ini diawali /products. Method findAll dengan @Get() merespons GET /products.

HTTP Method Decorators

NestJS menyediakan dekorator untuk setiap metode HTTP:

JSSemua metode HTTP di controller
@Controller("products")
export class ProductsController {
  @Get()
  findAll(): string[] {
    return ["Kaos", "Celana"];
  }
 
  @Post()
  create(): string {
    return "Produk dibuat";
  }
 
  @Put(":id")
  update(@Param("id") id: string): string {
    return `Produk ${id} diperbarui`;
  }
 
  @Delete(":id")
  remove(@Param("id") id: string): string {
    return `Produk ${id} dihapus`;
  }
 
  @Patch(":id")
  partialUpdate(@Param("id") id: string): string {
    return `Produk ${id} ditambal`;
  }
}

Masing-masing dekorator @Get, @Post, @Put, @Delete, dan @Patch memetakan metode HTTP ke method tertentu.

Route Parameter, Query Parameter, dan Body

Route Parameter dengan @Param

Route parameter memungkinkan nilai dinamis di URL:

JSMembaca route parameter
@Get(":id")
findOne(@Param("id") id: string): string {
  return `Produk dengan id ${id}`;
}

Meminta GET /products/123 akan mengisi id dengan nilai 123. Route :id harus dideklarasikan di path dekorator.

Query Parameter dengan @Query

Query parameter muncul setelah tanda tanya di URL:

JSMembaca query parameter
@Get()
findAll(@Query("limit") limit: string): string {
  return `Membatasi hasil sebanyak ${limit}`;
}

Meminta GET /products?limit=10 akan mengisi limit dengan 10. @Query bisa juga menerima seluruh objek query tanpa argumen.

Body Parsing dengan @Body

Untuk metode yang mengirim data di body, gunakan @Body:

JSMembaca body request
@Post()
create(@Body() body: { name: string; price: number }): string {
  return `Produk ${body.name} dengan harga ${body.price}`;
}

NestJS secara otomatis mem-parsing JSON body dan menyuntikkannya ke parameter. Nantinya, body lebih baik divalidasi memakai DTO — kita bahas di episode 7.

Response Handling dan Status Code

Status Code Default

NestJS memberi status code default: 200 untuk GET, 201 untuk POST. Kalian bisa mengubahnya dengan dekorator @HttpCode:

JSMengatur status code
import { Controller, Post, HttpCode, HttpStatus } from "@nestjs/common";
 
@Controller("products")
export class ProductsController {
  @Post()
  @HttpCode(HttpStatus.CREATED)
  create(): string {
    return "Produk dibuat";
  }
}

@HttpCode(HttpStatus.CREATED) memakai enum HttpStatus dari @nestjs/common agar kode tidak hard-coded.

Serialization Response

NestJS otomatis men-serialize nilai yang dikembalikan controller menjadi JSON. Kalian bisa mengembalikan objek, array, atau string — semuanya ditangani otomatis. Untuk kontrol lebih halus (misalnya menyembunyikan field), kita akan bahas interceptor dan class-transformer di episode 7 dan 18.

Mengirim Status Code dan Header Kustom

Selain @HttpCode, kalian bisa memakai @Header untuk header kustom atau memanfaatkan @Res untuk kontrol penuh atas response Express:

JSResponse memakai @Res
import { Controller, Get, Res } from "@nestjs/common";
import { Response } from "express";
 
@Controller("products")
export class ProductsController {
  @Get()
  findAll(@Res() res: Response): void {
    res.status(200).json(["Kaos", "Celana"]);
  }
}

Memakai @Res memberi kontrol penuh, tetapi kalian harus mengelola response secara manual. Disarankan memakai pendekatan default NestJS dan hanya memakai @Res saat benar-benar diperlukan.

Penutup

Episode 4 membekali kalian kemampuan penuh controller dan routing: dekorator metode HTTP, pembacaan parameter dari URL, query, dan body, serta pengendalian status code dan serialization.

Inti yang harus dibawa pulang:

  • @Controller("path") menetapkan prefix route untuk seluruh method.
  • @Get, @Post, @Put, @Delete, @Patch memetakan metode HTTP.
  • @Param membaca nilai dari path, @Query dari query string.
  • @Body mem-parsing JSON dari request body.
  • @HttpCode mengatur status code; default 200/201.
  • NestJS men-serialize otomatis nilai yang dikembalikan controller.

Di episode 5 selanjutnya kita akan membahas providers dan dependency injection — membuat service provider, menyuntikkannya ke controller, memahami scope singleton dan request-scoped, custom provider, factory provider, alias, serta cara berbagi provider antar module.