控制器
2024年2月23日...大约 3 分钟
什么是控制器
控制器 (Controllers) 负责处理传入的请求和向客户端返回响应。在 Nest 中,使用 @Controller
装饰器来定义控制器。
路由
基本使用
Nest 中的路由是指定义请求 URL 和处理函数之间的映射关系。
在 Nest 中,使用 @Get()
、@Post()
、@Put()
、@Patch()
、@Delete()
等装饰器来定义路由。
例如:
// src/test/test.controller.ts
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
} from '@nestjs/common';
import { TestService } from './test.service';
import { CreateTestDto } from './dto/create-test.dto';
import { UpdateTestDto } from './dto/update-test.dto';
@Controller('test')
export class TestController {
constructor(private readonly testService: TestService) {}
// 使用 POST 方法,通过 /test 路径来创建数据
@Post()
create(@Body() createTestDto: CreateTestDto) {
return this.testService.create(createTestDto);
}
// 使用 GET 方法,通过 /test 路径来访问
@Get()
findAll() {
return this.testService.findAll();
}
// 使用 GET 方法,通过 /test/:id 路径来访问,如:/test/1
@Get(':id')
findOne(@Param('id') id: string) {
return this.testService.findOne(+id);
}
// 使用 PATCH 方法,通过 /test/:id 路径来更新数据,如:/test/1
@Patch(':id')
update(@Param('id') id: string, @Body() updateTestDto: UpdateTestDto) {
return this.testService.update(+id, updateTestDto);
}
// 使用 DELETE 方法,通过 /test/:id 路径来删除数据,如:/test/1
@Delete(':id')
remove(@Param('id') id: string) {
return this.testService.remove(+id);
}
}
设置路由前缀 (Prefix)
在 main.ts
中设置路由前缀:
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// 设置路由以 /api 为前缀,但是直接通过域名访问的 / 根路由排除
app.setGlobalPrefix('api', {
exclude: ['/'],
});
await app.listen(3000);
}
bootstrap();
处理请求参数
查询字符串 (Query String)
使用 @Query()
装饰器来获取查询字符串参数:
// src/test/test.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
@Controller('test')
export class TestController {
@Get('query')
query(@Query() query) {
return `获取到的数据为:${query.name}、${query.age}`;
}
}
或:
// src/test/test.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
@Controller('test')
export class TestController {
@Get('query')
query(@Query('name') name: string, @Query('age') age: number) {
return `获取到的数据为:${name}、${age}`;
}
}
URL 参数 (URL Params)
使用 @Param()
装饰器和 :参数名
路径来获取 URL 参数:
// src/test/test.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
@Controller('test')
export class TestController {
@Get(':name')
params(@Param() params) {
return `获取到的数据为:${params.name}`;
}
}
或:
// src/test/test.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
@Controller('test')
export class TestController {
@Get(':name')
params(@Param('name') name: string) {
return `获取到的数据为:${name}`;
}
}
请求体 (Request Body)
使用 @Body()
装饰器来获取请求头:
// src/test/test.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { CreateTestDto } from './dto/create-test.dto';
@Controller('test')
export class TestController {
@Post()
body(@Body() createTestDto: CreateTestDto) {
return `获取到的数据为:${createTestDto.name}`;
}
}
或:
// src/test/test.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
@Controller('test')
export class TestController {
@Post()
body(@Body('name') name: string) {
return `获取到的数据为:${name}`;
}
}
请求头 (Request Header)
使用 @Headers()
装饰器来获取请求头:
// src/test/test.controller.ts
import { Headers, Controller, Post } from '@nestjs/common';
@Controller('test')
export class TestController {
@Post()
head(@Headers() header) {
return `获取到的数据为:${header.name}`;
}
}
或:
// src/test/test.controller.ts
import { Headers, Controller, Post } from '@nestjs/common';
@Controller('test')
export class TestController {
@Post()
head(@Headers('name') name: string) {
return `获取到的数据为:${name}`;
}
}
请求对象 (Request Object)
使用 @Req()
装饰器来获取请求对象:
// src/test/test.controller.ts
import { Controller, Get, Req } from '@nestjs/common';
@Controller('test')
export class TestController {
@Get('req')
req(@Req() req) {
return `获取到的数据为:${req.query.name}`;
}
}
状态码
使用 @HttpCode()
装饰器来设置状态码:
// src/app.controller.ts
import { Controller, Get, HttpCode } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@HttpCode(202)
@Get()
getHello(): string {
return this.appService.getHello();
}
}
响应头
使用 @Header()
装饰器来设置响应头:
// src/app.controller.ts
import { Controller, Get, HttpCode, Header } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@HttpCode(202)
@Header('Cache-Control', 'none')
@Get()
getHello(): string {
return this.appService.getHello();
}
}
Powered by Waline v3.3.2