Nest + Postgre + JWT + TypeORM 基于Nest和传统数据库Postgre的Node Restful API脚手架,适用于基础生产项目
参考https://github.com/surmon-china/nodepress
刚开始不习惯TypeORM,想使用传统sql来请求数据库,后面使用TypeORM也还习惯,原生兼容Nest、代码entity可以和数据库打通、API也还简单 查询参考:https://typeorm.biunav.com/zh/find-options.html#%E5%9F%BA%E7%A1%80%E9%80%89%E9%A1%B9
服务器端口及数据库配置、Auth配置等详见ap.config.ts
-
HTTP 状态码(详见 [errors] )
400
请求的业务被拒绝401
鉴权失败403
权限不足/请求参数需要更高的权限404
资源不存在405
无此方法500
服务器挂了200
正常201
POST 正常
-
数据特征码(详见 [http.interface.ts] )
status
:success
:正常error
:异常
message
:永远返回(由 [http.decorator] 装饰)error
:一般会返回错误发生节点的 error;在status
为error
的时候必须返回,方便调试debug
:开发模式下为发生错误的堆栈,生产模式不返回result
:在status
为success
的时候必须返回- 列表数据:一般返回
{ pagination: {...}, data: {..} }
- 具体数据:例如文章,则包含直接数据如
{ title: '', content: ... }
- 列表数据:一般返回
- 通用
略,采用传统关系数据库模型
-
入口
main.ts
:引入配置,启动主程序,引入各种全局服务app.module.ts
:主程序根模块,负责各业务模块的聚合app.controller.ts
:主程序根控制器app.config.ts
:主程序配置,数据库、程序、第三方,一切可配置项app.environment.ts:
全局环境变量
-
请求处理流程
request
:收到请求middleware
:中间件过滤(跨域、来源校验等处理)guard
:守卫过滤(鉴权)interceptor:before
:数据流拦截器(本应用为空,即:无处理)pipe
:参数提取(校验)器controller
:业务控制器service
:业务服务interceptor:after
:数据流拦截器(格式化数据、错误)filter
:捕获以上所有流程中出现的异常,如果任何一个环节抛出异常,则返回错误
-
鉴权处理流程
guard
:[守卫] 分析请求guard.canActivate
:继承处理JwtStrategy.validate
:调用 [鉴权服务]guard.handleRequest
:[根据鉴权服务返回的结果作判断处理,通行或拦截]
-
鉴权级别
- 任何高级操作(CUD)都会校验必须的 Token(代码见 [auth.guard.ts] )
- 涉及表数据读取的 GET 请求会智能校验 Token,无 Token 或 Token 验证生效则通行,否则不通行(代码见 [humanized-auth.guard.ts] )
-
参数校验逻辑(代码见 [query-params.decorator.ts] )
- 普通用户使用高级查询参数将被视为无权限,返回 403
- 任何用户的请求参数不合法,将被校验器拦截,返回 400
-
错误过滤器(代码见 [error.filter.ts] )
-
拦截器 [interceptors]
- [缓存拦截器]:自定义这个拦截器是是要弥补框架不支持 ttl 参数的缺陷
- [数据流转换拦截器]:当控制器所需的 Promise service 成功响应时,将在此被转换为标准的数据结构
- [数据流异常拦截器]:当控制器所需的 Promise service 发生错误时,错误将在此被捕获
- [日志拦截器]:代替默认的全局日志
-
装饰器扩展 [decorators]
- [缓存装饰器]:用于配置
cache key / cache ttl
- [控制器响应装饰器]:用于输出规范化的信息,如
message
和 翻页参数数据 - [请求参数提取器]:用户自动校验和格式化请求参数,包括
query/params/辅助信息
- [缓存装饰器]:用于配置
-
守卫 [guards]
- 默认所有非 GET 请求会使用 [Auth] 守卫鉴权
- 所有涉及到多角色请求的 GET 接口会使用 [HumanizedJwtAuthGuard] 进行鉴权
-
中间件 [middlewares]
- [Cors 中间件],用于处理跨域访问
- [Origin 中间件],用于拦截各路不明请求
-
管道 [pipes]
- validation.pipe 用于验证所有基于 class-validate 的验证类
-
业务模块 [modules]
- Cats Demo
-
核心辅助模块 [processors]
- [数据库]