- 作者:老汪软件技巧
- 发表时间:2024-08-18 21:04
- 浏览量:
前言
控制器负责处理传入的请求和向客户端返回响应。对于前端来说,可以理解为路由模块。
本文基于 Nest.js 从零到壹详细系列(一):项目创建&文件分析 叙述
1. 路由前缀
每一个要成为控制器的类,都需要借助@Controller装饰器的装饰,该装饰器可以传入一个路径参数,作为访问这个控制器的主路径。
对app.controller.ts文件进行修改
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
// 主路径为 app
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
运行yarn start:dev启动项目,使用Postman访问Get请求localhost:3000/app,得到Hello World!。
2. 全局路由前缀
除了上面这些装饰器可以设置路由外, 我们还可以设置全局路由前缀, 比如给所有路由都加上/api前缀。此时需要修改main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api'); // 设置全局路由前缀
await app.listen(3000);
}
bootstrap();
使用Postman访问Get请求localhost:3000/api/app,得到Hello World!。
3. 路由通配符
路由同样支持模式匹配。例如,星号被用作通配符,将匹配任何字符组合。
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
// 主路径为 app
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
// 通配符路径(?+* 三种通配符 )
// 可以匹配到 get请求, http://localhost:3000/api/app/user_xxx
@Get('user_*')
getUser() {
return 'getUser';
}
}
4. 路由类型
@Get(读取)、@Post(新建)、@Delete(删除)、@Put(更新)、@Patch(部分更新)等众多用于HTTP方法处理装饰器,经过它们装饰的方法,可以对相应的HTTP请求进行响应。
import { Controller, Get, Post } from '@nestjs/common';
@Controller('app')
export class AppController {
@Post()
create(): string {
return 'create';
}
@Get()
findAll(): string {
return 'findAll';
}
}
使用Postman访问POST请求localhost:3000/api/app,得到create。
使用Postman访问Get请求localhost:3000/api/app,得到findAll。
5. 路由接参1. 动态路由匹配 @Param
import { Controller, Get, Param } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('list/:id')
getHello(@Param() params): string {
const { id } = params;
return id;
}
}
使用Postman访问Get请求localhost:3000/api/app/list/2,得到“2”。
还可以将特定的参数标记传递给装饰器,然后在方法主体中按参数名称直接引用路由参数
//...
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('list/:id')
getHello(@Param('id') id): string {
return id;
}
}
2. query接参 @Query
import { Controller, Get, Query } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(@Query() params): string {
const { id } = params;
return id;
}
}
使用Postman访问Get请求localhost:3000/api/app?id=2,得到“2”。
3. body接参 @Body
import { Controller, Post, Body } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Post()
getHello(@Body() params): string {
const { id } = params;
return id;
}
}
使用Postman访问POST请求localhost:3000/api/app,body设置为JSON格式
{
"id":2
}
或者选择x-www-form-urlencoded格式
4. 获取请求头 @Headers
除了上述常见的三种传参方式,在请求头中获取参数也是常见的业务需求。
import { Controller, Headers, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('app')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(@Headers() headers): string {
const { userid } = headers;
return userid;
}
}
使用Postman访问GET请求localhost:3000/api/app,设置请求头{userid:123},返回123。
提示:请求头headers中的参数都是短横线命名法,即使用userid或user-id,不要使用userID。如果请求的时候,请求头中使用了userID,那么在Nest路由接参时,还是取的是userid。
6. 状态码
默认情况下,响应的状态码总是默认为 200,除了 POST 请求(默认响应状态码为 201),可以通过在处理函数外添加 @HttpCode(...) 装饰器来更改此行为。
@Post()
@HttpCode(204)
create() {
return 'This action adds a new cat';
}
7. 响应头
要指定自定义响应头,可以使用 @header() 装饰器或类库特有的响应对象
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
8. 重定向
要将响应重定向到特定的 URL,可以使用 @Redirect() 装饰器。@Redirect() 装饰器有两个可选参数,url 和 statusCode。 如果省略,则 statusCode 默认为 302。
@Get()
@Redirect('https://nestjs.com', 301)
有时可能想动态地决定 HTTP 状态代码或重定向 URL,函数返回的值将覆盖传递给 @Redirect()装饰器的所有参数。
@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
if (version && version === '5') {
return { url: 'https://docs.nestjs.com/v5/' };
}
}
9. 异步
Nest支持异步操作async/await。异步函数会返回一个Promise。
@Controller('cats')
export class CatsController {
@Get()
async findAll(): Promise {
return [];
}
}
结尾
后续会继续更新Nest相关的文章,对Nest感兴趣的,可先关注我。