likes
comments
collection
share

NestJS封装Redis类

作者站长头像
站长
· 阅读数 44

开发背景

书接上回,在开发个人博客的注册功能时,需要实现获取邮箱验证码上篇文章已经讲过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存储的keyvalue就是key所对应的ttl指的是存储时长,单位,默认给的是60 * 5,也就是将验证码保留5分钟type值是个固定值EX,具体可参考这里链接或者下图。

NestJS封装Redis类

然后封装一个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,
});

通过设置rediskeyemail:标识:邮箱,用以区分当前是哪个用户通过哪种渠道获取的邮箱验证码

然后接口再响应给前端验证码发送成功

接下来在注册接口内,我们需要获取验证码用来将用户输入的验证码加以验证。通过下面的方法直接来获取验证码。

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
评论
请登录