• 作者:老汪软件技巧
  • 发表时间: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;
  }
}

Nest.js 从零到壹详细系列(二):控制器_Nest.js 从零到壹详细系列(二):控制器_

使用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感兴趣的,可先关注我。