写在前面

跟着小满学nest.js csdn地址:https://xiaoman.blog.csdn.net/?type=blog

冷知识

  1. nest.js 中已经默认开启cors解决了跨域问题也可以选择关闭
1
const app = await NestFactory.create(AppModule, { cors: true }); //在main.ts中

中间件

  1. 局部中间件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export class UserModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
#applay为中间件 forRoutes为指定路径
#forRoutes 有3种用法
# 用法1:字符串 指定url
consumer.apply(Logger).forRoutes('user')
# 用法2:对象 指定url以及他的请求类型
consumer.apply(Logger).forRoutes({
path: 'user',
method: RequestMethod.POST
})
# 用法3 类 所有url
consumer.apply(Logger).forRoutes(UserController)
}
}
  1. 全局中间件
1
2
3
4
5
6
7
# 在main.ts中 使用 
app.use(MiddleWareAll) #use(函数)
#
function MiddleWareAll(req: Request, res: Response, next: NextFunction) {
console.log(req.originalUrl); #打印请求的url地址
next()
}

拦截器

拦截器具有一系列有用的功能,这些功能受面向切面编程(AOP)技术的启发。它们可以:

  1. 在函数执行之前/之后绑定额外的逻辑
  2. 转换从函数返回的结果
  3. 转换从函数抛出的异常
  4. 扩展基本函数行为
  5. 根据所选条件完全重写函数 (例如, 缓存目的)
    小满的文章 https://xiaoman.blog.csdn.net/article/details/126916268?spm=1001.2014.3001.5502

管道

管道 可以做两件事

  1. 转换,可以将前端传入的数据转成成我们需要的数据

  2. 验证 类似于前端的rules 配置验证规则

1
2
3
4
5
6
7
8
ValidationPipe
ParseIntPipe
ParseFloatPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
ParseEnumPipe
DefaultValuePipe

守卫

守卫和中间件的功能看上去好像重合了,但是中间件必须执行next()函数而执行nest()函数后会执行哪个程序
就不知道了。守卫可以访问ExecutionContext(执行上下文)实例所以可以知道接下来会执行什么。
官网链接: https://docs.nestjs.cn/9/guards

  1. 局部守卫: 太简单看官网

  2. 全局守卫

在main.ts中添加app.useGlobalGuards(new RolesGuard())
但是这样创建全局守卫是无法插入依赖的,原因是它在全局范围内注册了一个守卫(Guard),
而守卫是在 Nest.js 应用程序初始化时创建的,并且在运行过程中不会重新创建。
这也就意味着,一旦守卫被创建之后,它的依赖项就无法再次注入或更改。因此,
在调用 app.useGlobalGuards() 方法时,只能够传递不需要依赖项的静态类或工厂函数。
如果你需要在守卫中使用依赖注入机制,可以考虑使用构造函数注入的方式,将依赖项作为参数传递给守卫。此外,在某些情况下,你可能需要多个守卫共同工作,这时候可以通过使用 APP_GUARD 令牌,将多个守卫绑定在同一令牌上,并使用依赖注入机制来获取这些守卫的实例。

举个例子,假设我们需要为所有的请求添加一个身份验证的守卫,并且需要使用 AuthService 来进行身份验证。那么,我们可以定义一个身份验证守卫:

1
2
3
4
5
6
7
8
9
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) {}

canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
# 调用 AuthService 进行身份验证
return true; # 返回 true 表示验证通过,返回 false 则表示验证失败
}
}

然后,我们可以在 AppModule 中将这个守卫绑定到 APP_GUARD 令牌上,使其成为全局守卫:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { AuthGuard } from './auth.guard';

@Module({
providers: [
{
provide: APP_GUARD,
useClass: AuthGuard
}
]
})
export class AppModule {}

这样,我们就成功地将身份验证守卫注册为全局守卫,并使用依赖注入机制来获取 AuthService 的实例。需要注意的是,与 app.useGlobalGuards() 不同,在使用 APP_GUARD 令牌时,我们可以使用 useClass、useFactory 或 useValue 等方法来进行绑定,灵活性更高。

另一种身份验证的方法是使用SetMetadata在controller的指定路由下添加@SetMetadata(key,any)
然后在role.guard.ts(创建的守卫文件)中注入反射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core'; //引入
import { Request } from 'express'
@Injectable()
export class RoleGuard implements CanActivate {

constructor(private Reflector: Reflector) { } //注入反射

canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {

return true
}
}

可以通过传过来的key和值进行其他操作,我这里进行了一个身份验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
import { Request } from 'express'
@Injectable()
export class RoleGuard implements CanActivate {

constructor(private Reflector: Reflector) { }

canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
// get 接收两个参数一个是key 另一个是 处理程序
const admin = this.Reflector.get<string[]>('role', context.getHandler())
const req = context.switchToHttp().getRequest<Request>()
console.log("经过了守卫", req.query.role);
if (admin.includes(req.query.role as string)) {
return true
}
else {
return false
}
}
}

文件(上传,预览,下载)

  1. 看这篇文章 https://blog.csdn.net/Superman_H/article/details/130171512

各种插件及用法

  1. svg-captcha (生成验证码)
    官方链接 https://github.com/produck/svg-captcha/blob/1.x/README_CN.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
npm i svg-captcha -save  #下载
# 常用方法
@Get('code')
createCode(@Request() req, @Response() res, @Session() session) {
const Captchs = svgCaptcha.create({
size: 4, //生成几个验证码
fontSize: 50, //文字大小
width: 100, //宽度
height: 34, //宽度
background: '#cc9986', //背景颜色
})
session.code = Captchs.text
res.type('image/svg+xml') //转为图片格式
res.send(Captchs.data)
console.log(session.code);
}
  1. RxJs(编写异步或基于回调的)
    官网链接 https://cn.rx.js.org/

  2. swagger(用来写接口文档的)
    链接: https://github.com/nestjs/swagger
    小满: https://xiaoman.blog.csdn.net/article/details/127181578?spm=1001.2014.3001.5502

前后端结合

  1. 连接数据库
    看小满的: https://blog.csdn.net/qq1195566313/article/details/127195801?spm=1001.2014.3001.

  2. curd
    小满写的: https://blog.csdn.net/qq1195566313/article/details/127590610?spm=1001.2014.3001.