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 即可实现一套比较完整的业务逻辑。