热搜:前端 nest neovim nvim

Nestjs框架核心模块 => 控制器

lxf2023-06-16 03:00:25

快速创建控制器和服务器的ts文件

在终端执行命令,查看nest框架有哪些模块

nest -h

Nestjs框架核心模块 => 控制器

执行下方命令,快速构建控制器

    nest g controller user(控制器名字)

执行下方命令,快速构建服务器

    nest g controller user(服务器名字)

相同的名字,会归为同一个模块

Nestjs框架核心模块 => 控制器

控制器 controller

控制器负责处理传入的请求和向客户端返回响应

使用 @Controller() 装饰器定义一个基本的控制器

例如:

// 项目初始化时,生成的控制器
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

想要快速创建控制器,可以使用 CLI,执行命令

nest g controller controllername(控制器名字)

结果:

Nestjs框架核心模块 => 控制器

路由

一个完整的路由,由请求方式、请求接口路径、返回数据组成

  • 请求方式:最常见的就是get、post请求,用@Get和@Post装饰器来请求
  • 请求接口路径:控制器 (Controller) 声明的(可选)前缀和请求装饰器中指定的任何路径来确定的
  • 返回的数据:可以调用 server 服务器的方法,来返回数据
// user.controller.ts文件
// 路由
import { Controller, Get } from '@nestjs/common';
import { AppService } from '../app.service';
@Controller('user')
export class UserController {
  // 依赖注入
  constructor(private readonly appService: AppService) {}

  @Get('/v1')
  getRoute(): string {
    return this.appService.getRoute();
  }
}

// app.server.ts文件
// 服务器
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return '学习Nestjs框架';
  }
  getRoute() {
    return '学习Nestjs框架路由';
  }
}

第八行代码:

定义了一个构造函数,该函数接受一个AppService类型的参数,并将其注入到私有成员变量appService中。这个构造函数是通过依赖注入的方式将AppService服务类注入到UserController控制器类中,以便在控制器类的方法中使用。

在浏览器,访问路由地址(地址一定要完整)

完整的路由地址:控制声明的前缀和请求装饰器中的路径

结果:

Nestjs框架核心模块 => 控制器

如果返回数据是对象或数组,会自动序列化成 JSON 格式;当它返回一个 JavaScript 基本类型(例如string、number、boolean)时, Nest 将只发送值,而不会序列化返回数据

Nestjs框架核心模块 => 控制器

request、response(请求、响应)

Nest 提供了对底层平台(默认为 Express)的请求对象request)的访问方式和响应对象response)的接受方式。我们可以在处理函数的签名中使用 @Req() 和@Res()装饰器,指示 Nest 将请求对象和响应对象注入到处理程序。

import { Controller, Get, Req, Res } from '@nestjs/common';
import { Request, Response } from 'express';
@Controller('user')
export class UserController {
  @Get()
  getExample(@Req() req: Request, @Res() res: Response): void {
    res.set('X-Custom-Header', 'Hello');
    res.status(200).send('This is an example');
  }
}

在处理HTTP请求时,Nest.js框架会将请求对象和响应对象注入到方法参数中,我们就可以轻松地操作请求对象和响应对象了

Nest 为所有标准的 HTTP 方法提供了相应的装饰器:@Put()@Delete()@Patch()@Options()、 @Head()以及 @All,其中@All() 则用于定义一个用于处理所有 HTTP 请求方法的处理程序

例如:

import { All, Controller } from '@nestjs/common';
@Controller('cats')
export class CatsController {
  @All()
  fallback(): string {
    return 'This action handles all HTTP methods';
  }
}

路由通配符

通配符可以帮助我们更灵活地匹配 URL,提高路由的复用性和可维护性

@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}

代码中的通配符,路由会匹配任何以 ab 开头、以 cd 结尾的 URL,而中间的部分可以是任意字符。例如,它会匹配 /abcdefg/ab123cd/ab.cd 等 URL

状态码 @HttpCode()

可以通过在处理函数外添加 @HttpCode(...) 装饰器,来更改响应状态码

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

重定向

使用 @Redirect() 装饰器

import { Controller, Get, Redirect } from '@nestjs/common';
import { AppService } from '../app.service';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
  constructor(
    private readonly appService: AppService,
    private readonly userService: UserService,
  ) {}

  @Get('/v1')
  getRoute() {
    return this.appService.getRoute();
  }
  @Get('/v2')
  @Redirect('/user/v3')
  getName() {
    return this.userService.userName();
  }
  @Get('/v3')
  getAge() {
    return this.userService.getAge();
  }
}

当访问/user/v2地址时,会自动跳转并访问/user/v3地址,调用/user/v3路由下的方法

注意:

需要确保在应用中定义了 /user/v3 这个路由,否则重定向就会失败

路由参数

在路由路径中添加路由参数标记(token)以捕获请求 URL 中该位置的动态值

@Get() 装饰器的路由参数标记(route parameter token),声明的路由参数可以使用 @Param() 装饰器访问,该装饰器应添加到函数签名中。

// 通过引用 `params.id`来访问(路由路径中的) `id` 参数
@Get(':id')
findOne(@Param() params): string {
  console.log(params.id);
  return `This action returns a #${params.id} cat`;
}

@Get(':id') 表示这个路由处理器可以匹配任何以 /:id 结尾的 URL。例如,/cats/123/dogs/456 等 URL 都可以被匹配。

@Param() 装饰器用于获取 URL 中的参数,修饰一个方法的参数(上面示例中的 params),并在该方法内将路由参数作为被修饰的方法参数的属性

// 还可以将特定的参数标记传递给装饰器,然后在方法主体中按参数名称直接引用路由参数
@Get(':id')
findOne(@Param('id') id): string {
  return `This action returns a #${id} cat`;
}

请求负载

通过 @Body() 添加请求参数

创建 CreateCatDto 类,三个基本属性

/*
  create-cat.dto.ts
*/
export class CreateCatDto {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}

@Post()
async create(@Body() createCatDto: CreateCatDto) {
  return 'This action adds a new cat';
}

创建基本控制器

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';

@Controller('user')
export class CatsController {
  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return `This action removes a #${id} cat`;
  }
}

@Body() 装饰器表示这个方法从请求体中获取数据

@Query() 装饰器表示这个方法从查询字符串中获取参数

@Param('id') 装饰器表示这个方法从 URL 中获取 id 参数

@Put(':id') 装饰器表示这个方法处理 PUT 请求,并且 URL 中包含了一个 id 参数

@Body() 装饰器表示这个方法从请求体中获取数据

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!