NestJS Controller詳解:處理不同HTTP請求方法及路由參數
- 1102字
- 6分鐘
- 2024-07-08
NestJS 是一個用於構建高效、可擴展的 Node.js 服務端應用程序的框架。Controller是 NestJS 中的重要組成部分,它負責處理傳入的 HTTP 請求並返回響應。本文將詳細介紹如何在 NestJS 中創建Controller,處理不同的 HTTP 請求方法(如 GET、POST、PUT、DELETE),以及如何使用路由參數和請求體。
Controller概述
Controller用於定義應用程序中的路由和處理傳入的請求。每個Controller負責處理一組相關的請求,通常與特定的資源(如用戶、文章等)相關聯。在 NestJS 中,Controller通過裝飾器和類方法來定義。
創建Controller
在 NestJS 中,Controller通過 @Controller() 裝飾器來定義。以下是一個簡單的Controller示例:
1import { Controller, Get } from "@nestjs/common";2
3@Controller("users")4export class UsersController {5 @Get()6 findAll() {7 return "This action returns all users";8 }9}在上述示例中,我們定義了一個 UsersController 類,並使用 @Controller('users') 裝飾器將其標記為一個Controller,同時將其路由前綴設置為 users。findAll 方法通過 @Get() 裝飾器標記為處理 GET 請求。
處理不同的HTTP請求方法
NestJS Controller可以處理多種 HTTP 請求方法,包括 GET、POST、PUT、DELETE 等。以下是一個示例,展示了如何在Controller中處理這些請求方法:
1import {2 Controller,3 Get,4 Post,5 Put,6 Delete,7 Param,8 Body,9} from "@nestjs/common";10
11@Controller("users")12export class UsersController {13 @Get()14 findAll() {15 return "This action returns all users";16 }17
18 @Get(":id")19 findOne(@Param("id") id: string) {20 return `This action returns user with id ${id}`;21 }22
23 @Post()24 create(@Body() createUserDto: CreateUserDto) {25 return "This action adds a new user";26 }27
28 @Put(":id")29 update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {30 return `This action updates user with id ${id}`;31 }32
33 @Delete(":id")34 remove(@Param("id") id: string) {35 return `This action removes user with id ${id}`;36 }37}在上述示例中,我們定義了四個方法來處理不同的 HTTP 請求方法:
findAll處理 GET 請求,返回所有用戶。findOne處理帶有路由參數的 GET 請求,返回特定用戶。create處理 POST 請求,創建一個新用戶。update處理帶有路由參數的 PUT 請求,更新特定用戶。remove處理帶有路由參數的 DELETE 請求,刪除特定用戶。
使用路由參數
路由參數用於在 URL 中傳遞參數。在 NestJS 中,可以通過 @Param() 裝飾器來獲取路由參數。以下是一個示例:
1import { Controller, Get, Param } from "@nestjs/common";2
3@Controller("users")4export class UsersController {5 @Get(":id")6 findOne(@Param("id") id: string) {7 return `This action returns user with id ${id}`;8 }9}在上述示例中,findOne 方法通過 @Get(':id') 裝飾器定義了一個帶有路由參數 id 的 GET 請求。通過 @Param('id') 裝飾器,我們可以獲取路由參數 id 的值。
使用請求體
請求體用於在請求中傳遞數據,通常用於 POST 和 PUT 請求。在 NestJS 中,可以通過 @Body() 裝飾器來獲取請求體。以下是一個示例:
1import { Controller, Post, Body } from "@nestjs/common";2
3class CreateUserDto {4 readonly name: string;5 readonly age: number;6}7
8@Controller("users")9export class UsersController {10 @Post()11 create(@Body() createUserDto: CreateUserDto) {12 return `This action adds a new user with name ${createUserDto.name} and age ${createUserDto.age}`;13 }14}在上述示例中,create 方法通過 @Post() 裝飾器定義了一個 POST 請求。通過 @Body() 裝飾器,我們可以獲取請求體中的數據,並且使用了 CreateUserDto 類來進行類型約束。
參數詳解
@Controller():用於定義Controller,並指定路由前綴。@Get()、@Post()、@Put()、@Delete():用於定義處理不同 HTTP 請求方法的路由。@Param():用於獲取路由參數。@Body():用於獲取請求體。
DTO(數據傳輸對象)
DTO 是用於封裝請求數據的對象。在上述示例中,我們定義了一個 CreateUserDto 類來封裝創建用戶請求的數據:
1class CreateUserDto {2 readonly name: string;3 readonly age: number;4}路由參數和請求體類型約束
通過使用 TypeScript 的類型約束,我們可以確保路由參數和請求體的數據類型正確。以下是一個綜合示例,展示了如何使用路由參數和請求體:
1import { Controller, Get, Post, Put, Param, Body } from "@nestjs/common";2
3class UpdateUserDto {4 readonly name: string;5 readonly age: number;6}7
8@Controller("users")9export class UsersController {10 @Get(":id")11 findOne(@Param("id") id: string) {12 return `This action returns user with id ${id}`;13 }14
15 @Post()16 create(@Body() createUserDto: CreateUserDto) {17 return `This action adds a new user with name ${createUserDto.name} and age ${createUserDto.age}`;18 }19
20 @Put(":id")21 update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {22 return `This action updates user with id ${id}, new name ${updateUserDto.name}, new age ${updateUserDto.age}`;23 }24}總結
本文詳細介紹了 NestJS 中的Controller,講解了如何創建Controller來處理不同的 HTTP 請求方法(如 GET、POST、PUT、DELETE),以及如何使用路由參數和請求體。