Nest 中的数据库集成、JWT身份认证与任务调度全解析
1. 集成 PostgreSQL 数据库
1.1. 集成步骤
在 NestJS 中集成 PostgreSQL 数据库可以通过 TypeORM 来实现。以下是详细的集成步骤:
安装依赖:使用 npm 安装 TypeORM 和 PostgreSQL 驱动。
npm install @nestjs/typeorm typeorm pg
配置数据库连接:在 app.module.ts 中配置 TypeORM 模块,指定数据库类型、主机、端口、用户名、密码、数据库名称以及实体文件路径。
实现查询操作:通过定义 Repository 来对数据库进行增删改查操作。
1.2. 工作原理
ORM:ORM 是一种程序设计技术,用于将不同类型的数据进行转换,实现面向对象编程语言与数据库之间的交互。TypeORM 是一个 ORM 工具,提供了对 PostgreSQL 的支持,可以自动管理数据库的迁移、连接和查询。
TypeORM:作为对象关系映射工具,TypeORM 提供了装饰器来定义实体、列、关系等,简化了数据库操作。
2. 实现 JWT 身份认证
2.1. JWT 身份认证原理
JWT身份认证是通过在用户登录后生成一个加密的令牌,并在后续的请求中附带该令牌以证明用户身份。Nest 使用 @nestjs/jwt 和 @nestjs/passport 实现身份认证。
2.2. 实现步骤
安装必要的包。
npm install @nestjs/jwt @nestjs/passport passport passport-jwt
配置 JWT 模块:在 auth.module.ts 中配置 JWT 模块,指定密钥和令牌有效期。
实现 JWT 策略:创建 JWT 策略类,通过 passport-jwt 来验证令牌。
用户认证与生成 Token:在登录时,通过 jwtService.sign() 方法生成令牌。
2.3. 工作原理
用户登录时,服务器通过 jwtService.sign() 生成一个包含用户信息的 JWT 令牌。
在后续请求中,用户需要在请求头中附带此令牌,服务器通过 JWT 策略对令牌进行验证,确保请求来自合法用户。
2.4. 拓展:单点登录 SSO
Cookie:常规系统可使用,但不具备跨平台能力,无法通用化。
单 Token(AccessToken):具备跨平台能力,但时效性不好控制,缺乏安全性。
双 Token(RefreshToken + AccessToken):常见实现无感刷新 Token 的方案。
Token + Cookie:结合使用,提高安全性和用户体验。
3. 实现定时任务和任务队列管理
3.1. 定时任务
安装 @nestjs/schedule 包。
npm install @nestjs/schedule
在服务中引入 Cron 装饰器:通过 Cron 表达式定义任务的执行时间。
3.2. 任务队列管理
安装 @nestjs/bull 包。
npm install @nestjs/bull bull
配置任务队列:在 app.module.ts 中配置 Bull 模块,指定 Redis 连接信息。
创建任务队列:定义队列服务,通过 @InjectQueue 注入队列实例,实现任务的添加和处理。
3.3. 工作原理
定时任务:通过 Cron 表达式定义任务的执行时间,当达到设定时间时,任务会自动触发执行。
任务队列:通过 Bull 模块,任务可以被加入 Redis 中的任务队列,并根据优先级或延时执行。队列支持任务的重试、失败处理和并发处理,适用于复杂的任务调度和分布式任务处理。