写在前面
跟着小满学nest.js csdn地址:https://xiaoman.blog.csdn.net/?type=blog
冷知识
- nest.js 中已经默认开启cors解决了跨域问题也可以选择关闭
1
| const app = await NestFactory.create(AppModule, { cors: true }); //在main.ts中
|
中间件
- 局部中间件
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 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)技术的启发。它们可以:
- 在函数执行之前/之后绑定额外的逻辑
- 转换从函数返回的结果
- 转换从函数抛出的异常
- 扩展基本函数行为
- 根据所选条件完全重写函数 (例如, 缓存目的)
小满的文章 https://xiaoman.blog.csdn.net/article/details/126916268?spm=1001.2014.3001.5502
管道
管道 可以做两件事
-
转换,可以将前端传入的数据转成成我们需要的数据
-
验证 类似于前端的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
-
局部守卫: 太简单看官网
-
全局守卫
在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 } } }
|
文件(上传,预览,下载)
- 看这篇文章 https://blog.csdn.net/Superman_H/article/details/130171512
各种插件及用法
- 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); }
|
-
RxJs(编写异步或基于回调的)
官网链接 https://cn.rx.js.org/
-
swagger(用来写接口文档的)
链接: https://github.com/nestjs/swagger
小满: https://xiaoman.blog.csdn.net/article/details/127181578?spm=1001.2014.3001.5502
前后端结合
-
连接数据库
看小满的: https://blog.csdn.net/qq1195566313/article/details/127195801?spm=1001.2014.3001.
-
curd
小满写的: https://blog.csdn.net/qq1195566313/article/details/127590610?spm=1001.2014.3001.