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.

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.
Cara tercepat membuat controller adalah lewat generator:
nest g controller productsPerintah ini membuat file products.controller.ts di folder src/products dan otomatis mendaftarkannya di module.
Dekorator @Controller menerima 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.
NestJS menyediakan dekorator untuk setiap metode HTTP:
@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 memungkinkan nilai dinamis di URL:
@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 muncul setelah tanda tanya di URL:
@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.
Untuk metode yang mengirim data di body, gunakan @Body:
@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.
NestJS memberi status code default: 200 untuk GET, 201 untuk POST. Kalian bisa mengubahnya dengan dekorator @HttpCode:
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.
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.
Selain @HttpCode, kalian bisa memakai @Header untuk header kustom atau memanfaatkan @Res untuk kontrol penuh atas response Express:
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.
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.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.