nestjs 的模板项目
完成一个完整的模板,模板功能对标公司内部的人员、资产系统
- 用户表 user
- 公司表 company
- 资产表 asset
- 角色表 role
- jwt
- swagger
- 中间件、拦截、权限校验这些完整流程
- 不同用户不同权限 - 不能越权请求(角色拥有多个权限,用户是可能拥有多个角色)
- 所有表的操作以及互相链接的操作(资产、用户、公司需要图片这种,或者视频,以及转让这些) - 暂时没做图片视频这种
- 多端登录自动退出
- 用户登录图形验证码
- 敏感信息(用户密码)都用双向加密 - bcrypt
- 并发,锁;比如操作同一个资产
完成之后,要放入docker,然后放入服务器,买个域名;最后再写个前端项目配套
在Nest的生命周期中,客户端发起一个请求后,服务器接到请求内容,经过
- 中间件
- 守卫
- 拦截器
- 管道
- 真正业务逻辑处理
- 拦截器
- 请求结束返回内容
而管道是处于请求过程中第四个内容,主要是用于对请求参数的验证和转换操作。
作用:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求-响应周期。
- 调用堆栈中的下一个中间件函数。
- 如果当前的中间件函数没有结束请求-响应周期, 它必须调用 next() 将控制传递给下一个中间件函数。否则, 请求将被挂起
场景: 拿到请求路径对某些请求进行特殊拦截、对入参进行更改....
使用:
- 全局中间件(demo内实现了)
- 局部使用(demo内实现了)
作用: 控制一些权限内容(同一路由注册多个守卫的执行顺序为,先是全局守卫执行,然后是模块中守卫执行)
场景: 一些接口需要带上token标记,才能够调用,守卫则是对这个标记进行验证操作的,以及一些权限接口
使用:
- 全局守卫 app.useGlobalGuards(new GuardGuard())
- 局部使用 @UseGuards(GuardGuard)
作用:
- 在函数执行之前/之后绑定额外的逻辑
- 转换从函数返回的结果
- 转换从函数抛出的异常
- 扩展基本函数行为
- 根据所选条件完全重写函数 (例如, 缓存目的)
场景: 对成功响应的接口的返回值进行包装
使用:
- 全局拦截器 app.useGlobalInterceptors(new Response())
- 局部使用 @UseInterceptors(Response)
备注: 拦截器的执行顺序分为两个部分: 第一个部分在管道和自定义逻辑(next.handle()方法)之前。 第二个部分在管道和自定义逻辑(next.handle()方法)之后
中间多了个全局管道以及自定义逻辑,即只有路由绑定的函数有正确的返回值之后才会有next.handle()之后的内容,顺序:
- 进入全局响应拦截器
- 进入管道
- 进入next.handle()方法
项目中使用class-validator class-transformer进行配合验证相关的输入操作内容
作用:
- 主要用于对请求参数的验证
- 对请求参数的转换操作
使用(demo中这俩个是都用了,配合使用的):
- 全局管道 app.useGlobalPipes(new ValidationPipe())
- 局部使用 findAll(@Query(GuradFindAllPipe) query: FindAllGuardDto) / UsePipes(FindAllGuardDto)
备注: 同一路由注册多个管道的时候,优先执行全局管道,然后再执行模块管道:
异常过滤器是所有抛出的异常的统一处理方案
作用: 捕获系统抛出的所有异常,然后自定义修改异常内容,抛出友好的提示
使用:
- 全局 app.useGlobalFilters(new HttpFilter())
- 局部 UseFilters(HttpFilter)
备注: 同一路由注册多个管道的时候,只会执行一个异常过滤器,优先执行模块中绑定的异常过滤器,如果模块中无绑定异常过滤则执行全局异常过滤器
系统提供了不少内置的系统异常类,需要的时候直接使用throw new XXX(描述,状态)这样的方式即可抛出对应的异常,一旦抛出异常,当前请求将会终止。 注意每个异常抛出的状态码有所不同 (可参数管道中是如何使用的)
BadRequestException — 400 UnauthorizedException — 401 ForbiddenException — 403 NotFoundException — 404 NotAcceptableException — 406 RequestTimeoutException — 408 ConflictException — 409 GoneException — 410 PayloadTooLargeException — 413 UnsupportedMediaTypeException — 415 UnprocessableEntityException — 422 InternalServerErrorException — 500 NotImplementedException — 501 BadGatewayException — 502 ServiceUnavailableException — 503 GatewayTimeoutException — 504
- nest中 生成的 swagger 文档,怎么配置接口前缀呀,比如 /test/get 要展示为 /api/test/get
- 模拟jwt
- 设置全局成功状态、异常状态 code
- typeorm 要多熟悉一下
- 做好了最基本的业务,再去看看模板,然后总结一套自己的
- 对某些业务接口做入参校验 - 一般接口都会对前端提供的参数进行校验吗?
- 密码应该加密
- 怎么保护一个字段从数据库层面被设置只读或者删除,例如用户账号
目前role并没有去实时拿到用户当前权限然后过滤,后面得注意 读写不频繁,速度要求不高就直接数据库 访问量级上来了,延迟要求低,再加一个 redis 有异步的逻辑,高并发的场景,还可以考虑加个 MQ
nestjs项目目录 https://www.imooc.com/article/315772 nestjs项目目录 https://juejin.cn/post/6844904192687996936#comment
nestjs 学习导航 https://blog.csdn.net/weixin_44828005/article/details/115499297