- Nest.js从零开始学习
- Nest.js概述
- 环境搭建
- 基本概念
- 依赖注入(Dependency Injection)
- 中间件与管道
- 路由与请求处理
- Nest.js 框架异常处理
- Nest.js 框架数据库操作
- Nest.js 框架认证与授权
- Nest.js 框架 WebSockets 与实时通信
- Nest.js 框架 GraphQL 支持
- Nest.js 框架微服务架构
- Nest.js 框架测试
- Nest.js 框架性能优化与安全
- Nest.js 项目实战:创建一个完整的用户管理应用
路由与请求处理
class 路由在Nest.js中,路由用于定义客户端请求的处理方式。通过路由,开发者可以指定URL路径、HTTP方法以及如何处理相应的请求和响应。
1. 定义路由
在Nest.js中,路由通过控制器中的装饰器来定义。常用的装饰器有@Get()
、@Post()
、@Put()
、@Delete()
等。
示例
import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get() // 处理 GET 请求
getAllUsers() {
return 'This action returns all users';
}
@Get(':id') // 处理 GET 请求,带有参数
getUserById(@Param('id') id: string) {
return `This action returns user with id: ${id}`;
}
@Post() // 处理 POST 请求
createUser(@Body() createUserDto: any) {
return `This action creates a user with data: ${JSON.stringify(createUserDto)}`;
}
@Get('search') // 处理带查询参数的 GET 请求
searchUsers(@Query('name') name: string) {
return `This action returns users with name: ${name}`;
}
}
2. 处理请求和响应
- 请求体(Request Body):可以通过
@Body()
装饰器获取请求体中的数据。 - 路径参数(Path Parameters):可以通过
@Param()
装饰器获取路径中的参数。 - 查询参数(Query Parameters):可以通过
@Query()
装饰器获取查询字符串中的参数。
详细说明
@Get()
:定义处理GET请求的方法。可以定义一个路由处理所有用户,或处理特定用户(通过ID)。@Post()
:定义处理POST请求的方法,接收请求体中的数据并创建用户。@Param()
:用于获取路径参数。路由定义为users/:id
,可以通过@Param('id')
获取ID。@Query()
:用于获取查询参数,例如/users/search?name=John
,可以通过@Query('name')
获取name
的值。
3. 在项目中的完整应用
下面是一个完整的Nest.js项目结构示例,展示了如何使用路由和请求处理。
src
├── app.module.ts // 根模块
├── users
│ ├── users.controller.ts // 用户控制器
│ ├── users.service.ts // 用户服务
│ └── users.module.ts // 用户模块
users.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [];
findAll() {
return this.users;
}
findOne(id: string) {
return this.users.find(user => user.id === id);
}
create(user: any) {
this.users.push(user);
return user;
}
searchByName(name: string) {
return this.users.filter(user => user.name === name);
}
}
users.controller.ts
import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
getAllUsers() {
return this.usersService.findAll();
}
@Get(':id')
getUserById(@Param('id') id: string) {
return this.usersService.findOne(id);
}
@Post()
createUser(@Body() createUserDto: any) {
return this.usersService.create(createUserDto);
}
@Get('search')
searchUsers(@Query('name') name: string) {
return this.usersService.searchByName(name);
}
}
users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
app.module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}
总结
在Nest.js中,路由通过控制器中的装饰器进行定义,能够处理不同类型的HTTP请求。通过@Body()
、@Param()
和@Query()
装饰器,可以轻松访问请求体、路径参数和查询参数。结合服务,开发者可以构建出功能丰富的API。这种结构化的方式使得代码更易于维护和扩展。
评论区
评论列表
{{ item.user.nickname || item.user.username }}