NestJS Controllers详解:处理不同HTTP请求方法及路由参数
- 1106字
- 6分钟
- 2024-07-08
控制器(Controllers)是 NestJS 中的重要组成部分,它负责处理传入的 HTTP 请求并返回响应。本文将详细介绍如何在 NestJS 中创建Controller,处理不同的 HTTP 请求方法(如 GET、POST、PUT、DELETE),以及如何使用路由参数和请求体。
控制器概述
控制器用于定义应用程序中的路由和处理传入的请求。每个控制器负责处理一组相关的请求,通常与特定的资源(如用户、文章等)相关联。在 NestJS 中,控制器通过装饰器和类方法来定义。
创建控制器
在 NestJS 中,控制器通过 @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')
装饰器将其标记为一个控制器,同时将其路由前缀设置为 users
。findAll
方法通过 @Get()
装饰器标记为处理 GET 请求。
处理不同的HTTP请求方法
NestJS 控制器可以处理多种 HTTP 请求方法,包括 GET、POST、PUT、DELETE 等。以下是一个示例,展示了如何在控制器中处理这些请求方法:
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 中的控制器,讲解了如何创建控制器来处理不同的 HTTP 请求方法(如 GET、POST、PUT、DELETE),以及如何使用路由参数和请求体。


