Nest学习系列
✈️一文带你入门【NestJS】
✈️前言
流程图
Controllers 控制器主要负责处理传入请求,并向客户端返回响应,控制器可以通过路由机制来控制接收那些请求,通常一个Controllers种会有多个匹配路由,不同的路由可以知情不同操作,我们可以通过装饰器将类与所需要的元数据关联,使得Nest能够将路由映射到对应的控制器。
⚠️注意:我们这里所说的路由并不是前端页面上的路由,而是我们调用api接口的路由
🚩如何创建 controller
//通过nest-cli 脚手架命令处理
nest g controller [name]
🚩基础概念
-
路由:
@Controller(‘news’)
装饰器中的news 作为可选路径前缀,利用这个我们可以对controller进行分组
@Get 为Http 请求方法装饰器,代表我们的请求方法
@Get(‘/page’),在请求方法装饰器种添加自定义路径之后,结合Controller 中的可选路径,会组合形成
/news/page
-
请求对象
-
通配符
@Get(‘abcd’)
'abcd’ 路由路径将匹配 abcd、ab_cd、abecd 等。字符 ?、+、* 和 () 可以在路由路径中使用,并且是它们对应的正则表达式的子集。连字符 (-) 和点 (.) 由基于字符串的路径逐字解释。 -
状态码
@HttpCode() 装饰器来设置对应Http 状态码,默认 200
@Post()
@HttpCode(204)
create() {return 'This action adds a new news';
}
- 重定向
要将响应重定向到特定 URL,你可以使用 @Redirect()
@Get()
@Redirect('https://nest.nodejs.cn', 301)
- 获取路由参数
@Query方式
http://localhost:3000/news/page?id=2222&keyword=%27sss%27
@Param方式
http://localhost:3000/news/page/5
- 异步性
Nest 支持 async await 与 RxJS 的观察流模式,可以通过这两种方式实现 异步
- 请求负载
@Body()
注意:在接受参数之前我们需要确定DTO架构,我们可以先用TS的接口或者类实现一个简单的DTO
建议使用类实现,因为接口在TS转换JS的过程会被删除,在运行时候可能访问不到
🚩实例代码
news.controller.ts
import { Controller,Get,Post, Put,Delete,Redirect, Param,Query, Body } from '@nestjs/common';
import { Request,Response, query } from 'express';
import { Observable, of } from 'rxjs';
import { CreateNewsDto,UpdateNewsDto } from './create-news.dto'
@Controller('news')
export class NewsController {@Get('/page')// @Redirect('https://nest.nodejs.cn')getNewsPageList(@Query() query: string): string {console.log(query);return 'This is the news page111';}@Get('/detail/:id')getNewsById(@Param() params: string): string {console.log(params);return 'This is the news detail page';}// 异步 async @Get('/async')async getNewsList(): Promise<string> {setTimeout(() => {console.log('This is the async news list');}, 2000);return 'This is the async news list';}// 异步 Observable 模式@Get('/observable')getNewsListObservable(): Observable<any[]> {return of([]);}@Post('/create')createNews(@Body() createNewsDto: CreateNewsDto): string {console.log(createNewsDto,'添加参数');return 'This is the create news message';}@Put('/update/:id')updateNews(@Body() updateNewsDto: UpdateNewsDto): string {return 'This is the update news message';}@Delete('/delete/:id')deleteNews(): string {return 'This is the delete news message'; }}
create-news.dto
export class CreateNewsDto {title: string;tag: string;author: string;content: string;}export class UpdateNewsDto {id:number;title: string;tag: string;author: string;content: string;
}
🚩结语
这篇文章主要介绍了Nest的Controller 控制器,简洁明了,实现了一个基础的新闻模块增删改查的框架,后端增加对应的service 即可实现一套比较完整的业务逻辑。