NestJS Controllers详解:处理不同HTTP请求方法及路由参数

控制器(Controllers)是 NestJS 中的重要组成部分,它负责处理传入的 HTTP 请求并返回响应。本文将详细介绍如何在 NestJS 中创建Controller,处理不同的 HTTP 请求方法(如 GET、POST、PUT、DELETE),以及如何使用路由参数和请求体。

控制器概述

控制器用于定义应用程序中的路由和处理传入的请求。每个控制器负责处理一组相关的请求,通常与特定的资源(如用户、文章等)相关联。在 NestJS 中,控制器通过装饰器和类方法来定义。

创建控制器

在 NestJS 中,控制器通过 @Controller() 装饰器来定义。以下是一个简单的控制器示例:

1
import { Controller, Get } from "@nestjs/common";
2
3
@Controller("users")
4
export class UsersController {
5
@Get()
6
findAll() {
7
return "This action returns all users";
8
}
9
}

在上述示例中,我们定义了一个 UsersController 类,并使用 @Controller('users') 装饰器将其标记为一个控制器,同时将其路由前缀设置为 usersfindAll 方法通过 @Get() 装饰器标记为处理 GET 请求。

处理不同的HTTP请求方法

NestJS 控制器可以处理多种 HTTP 请求方法,包括 GET、POST、PUT、DELETE 等。以下是一个示例,展示了如何在控制器中处理这些请求方法:

1
import {
2
Controller,
3
Get,
4
Post,
5
Put,
6
Delete,
7
Param,
8
Body,
9
} from "@nestjs/common";
10
11
@Controller("users")
12
export 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() 装饰器来获取路由参数。以下是一个示例:

1
import { Controller, Get, Param } from "@nestjs/common";
2
3
@Controller("users")
4
export 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() 装饰器来获取请求体。以下是一个示例:

1
import { Controller, Post, Body } from "@nestjs/common";
2
3
class CreateUserDto {
4
readonly name: string;
5
readonly age: number;
6
}
7
8
@Controller("users")
9
export 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 类来封装创建用户请求的数据:

1
class CreateUserDto {
2
readonly name: string;
3
readonly age: number;
4
}

路由参数和请求体类型约束

通过使用 TypeScript 的类型约束,我们可以确保路由参数和请求体的数据类型正确。以下是一个综合示例,展示了如何使用路由参数和请求体:

1
import { Controller, Get, Post, Put, Param, Body } from "@nestjs/common";
2
3
class UpdateUserDto {
4
readonly name: string;
5
readonly age: number;
6
}
7
8
@Controller("users")
9
export 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),以及如何使用路由参数和请求体。

美团外卖红包 饿了么红包 支付宝红包