在 Nestjs 中使用验证码

在 Nestjs 中使用验证码

依赖安装

shell
pnpm i svg-captcha uuid @nestjs/cache-manager

创建并配置 captcha 模块

shell
nest g res system/captcha --no-spec

更改 captcha.controller.ts

  1. 我们可以选择生成字母数字类型的或者数学计算的验证码
  2. 我们需要一个校验用户是否输入正确验证码的接口
captcha.controller.tsts
import { Controller, Get, Query } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';

import { CaptchaService } from './captcha.service';

@ApiTags('本地验证码')
@Controller('captcha')
export class CaptchaController {
    constructor(private readonly captchaService: CaptchaService) {}

    @Get('svg')
    createSvg() {
        return this.captchaService.create('svg');
    }

    @Get('math')
    createMath() {
        return this.captchaService.create('math');
    }

    @Get('verify')
    get(@Query('key') key: string, @Query('text') text: string) {
        return this.captchaService.verify(key, text);
    }
}

根据 captcha.controller.ts 需要的功能我们来更改 captcha.service.ts

  • 这里使用 uuid 可以最大概率保证 key 的唯一性
  • 记得 Cache 模块一定要从 @nestjs/cache-manager 包中导入
  • 这里需要用到缓存模块,下一部分会说明

cache-keys.enum.ts 的内容为

cache-keys.enum.tsts
export const CacheKeys = {
    CAPTCHA_CACHE_KEY: 'captcha',
} as const;

配置缓存模块

在 app.module 中我们需要配置一下缓存模块,让它使用 redis 而不是默认的内存缓存

这里的 config 模块使用我们自己改变的一种写法(当然这个是在官方文档里有说明的),这种写法可以让我们在取用配置时有提示,我这里有另一篇文章来说明

清理代码

使用命令创建的 captcha 模块会有 entity 和 dto,这里我们用不到可以将其删除。

nest-config 模块的人体工学适配
在 Nestjs 中使用 Drizzle ORM