路由与请求处理

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。这种结构化的方式使得代码更易于维护和扩展。

评论区
评论列表
menu