NestJS封装Redis类
开发背景
书接上回,在开发个人博客
的注册功能时,需要实现获取邮箱验证码
,上篇文章已经讲过NestJS如何发送邮箱验证码
,这篇文章来聊一聊获取到验证码之后怎样存储、以及怎样去验证。
介绍Redis
毕竟我也不是专业的后端,这里就浅浅说一下redis
。后端开发中,一定少不了数据库
,而数据库又分为好几种,比如关系型数据库
,如:MySQL,比如缓存型数据库
,如:Redis
。
关系型数据库
一般用来存储具有复杂关系的数据。
缓存型数据库
一般用来存储频繁使用的数据,并且可以设置过期时间,查询效率比较高。
封装Redis类
配置文件
如果你看了上一篇文章,那你应该知道我的项目内有一个配置文件
,假设他就叫config.ts
,那么我们需要在这个配置文件中配置好所要连接的Redis数据库
。
REDIS: {
host: "192.168.31.194",
port: 6379,
password: "webxue",
ttl: 60,
db: 0,
},
接下来介绍一下这些参数:
host
:指的是安装redis
的服务器ip
,这里我是本机内网ip
。port
:指的是redis
所占用的端口号,一般默认都是6379
。password
:指的是redis
的登录密码。ttl
:指的是redis
存储数据的默认过期时间,单位秒
。db
:指的是连接redis
的第几个数据库,redis默认有16
个数据库,0-15
。
安装依赖
这里我使用的是ioredis
这个依赖。
npm i ioredis
封装类
首先我在src/tools
目录下新建一个RedisTool.ts
文件作为Redis
的操作类
。
引入必须的依赖
和配置
。
import Ioredis from "ioredis";
import { REDIS } from "src/config";
接下来把类的骨架
实现。
export class Redis {
constructor(){}
}
需要在类
中定义一个私有属性redisCache
。
export class Redis {
private redisCache;
constructor(){}
}
然后在constructor
中初始化它:
constructor(){
// 通过实例化Ioredis来初始化Redis
this.redisCache = new Ioredis({
port: REDIS.port,
host: REDIS.host,
password: REDIS.password,
db: REDIS.db,
});
}
作为一名前端,我更习惯于面向过程
编程,但我觉得面向对
象更加优雅
,所以我会尽可能地去学习面向对象
的思想。通过new
操作符实例化Redis
来生成一个Redis实例
,通过实例方法来操作Redis
。
接下来封装实例方法,首先封装一个set
方法,用来存储数据。
async set({ key, value, ttl = 60 * 5, type = "EX" }){
return await this.redisCache.set(key, value, type, ttl);
}
这里的key
就是Redis
存储的key
,value
就是key
所对应的值
,ttl
指的是存储时长
,单位秒
,默认给的是60 * 5
,也就是将验证码保留5分钟
,type
值是个固定值EX
,具体可参考这里链接或者下图。
然后封装一个get
方法,用来获取数据。
async get(key: string) {
return await this.redisCache.get(key);
}
这里就比较简单了,只需要传入key
,调用redisCache.get
方法就能拿到查出来的数据,返回即可。
最后再封装一个del
方法,用来删除数据,主要用于验证码输入成功之后,手动删除
Redis存储的验证码。
async del(key: string) {
return await this.redisCache.del(key);
}
同get
方法,只需要传入key
就可以了。
使用方法
在上篇文章中,我们在获取验证码的接口中通过new Email().send(...)
来发送验证码,那发送完验证码之后,需要将当前的验证码存起来,通过下面的调用就可以存起来验证码。
await new Redis().set({
key: `email:register:${request.email}`,
value: CODE,
});
通过设置redis
的key
为email:标识:邮箱
,用以区分当前是哪个用户
通过哪种渠道
获取的邮箱验证码
。
然后接口再响应给前端验证码发送成功
。
接下来在注册接口内,我们需要获取验证码
用来将用户输入的验证码加以验证。通过下面的方法直接来获取验证码。
const code = await new Redis().get(
`email:register:${request.email}`,
);
-
如果
code
不存在,则说明已经超过了5分钟
,验证码被自动删除
了,则提示用户验证码过期
。 -
如果这个
code
和用户输入过来的code
不一致,说明验证码输入有误,则提示用户验证码输入有误
。 -
如果
code
和用户输入过来的code
一致,则说明验证正确,带其他验证无误之后,调用下面的代码主动删除验证码,并告诉用户注册成功。
await new Redis().del(
`email:register:${request.email}`,
);
到这里,邮箱验证码的发送与存储、验证就已经全部完成了。
结语
都说后端转前端容易,前端转后端难,当我涉及到一些具体业务时,确实比较费脑筋,但这么有挑战的事情,谁会不爱呢~,我不是一名专业的后端,如果你觉得哪里欠妥,或者有别的建议和意见,欢迎评论区聊聊,一起学习,一起进步!!!
转载自:https://juejin.cn/post/7221151497973841977