js使用svg-captcha生成图片验证码

nodejs(nestjs)后端开发过程中会有一个需要生成图片验证码的功能,其能减少机器人攻击操作,这也是开发过程中比较常见的功能,这边我们通过 svg-captcha,来实现一个验证码功能,并且小小的优化一下其逻辑

首先导入对应库 svg-captcha

js 复制代码
yarn add svg-captcha

基础使用就这样了,很简单

js 复制代码
var svgCaptcha = require('svg-captcha');

const svg = svgCaptcha.create()
svg.text 文本
svg.data 图片数据
文本保存用于校验,图片数据返回给客户端,让客户端进行对比即可

这个验证码只能生成文本和图片,正常生成代码的时候我们需要给其一个随机验证码,这样我们需要保存文本信息,方便用于校验,甚至传一个自己生成的id当唯一值对比,但仍然会存在一个问题,这个验证码是没有身份信息的,随便一个人访问都要生成一个新的,那么短时间内人过多的话,会生成非常多的验证码(当然我们只保存一个自己生成的id、text正常用肯定没事,过期清理即可)

如果碰到人特别多的情况怎么办,我们直接保存几个验证码文本和图片即可,假设限定数量10个,循环利用,有效期1分钟,过期剔除换新的,用完定期清理即可,优点数量少访问快,缺点就是一段时间内会出现重复的(实际上稍微多增加几个就看不出来了,因为下次是随机的,过期也会换新的,内存峰值最大也就那样了,以假乱真)

ps:开发的世界真真假假谁有分得清呢

js 复制代码
//自己也可以根据需要添加 id 哈,这里就加入id了,只要对一个是对的那么就是对的,自己可以更加严谨点哈
type ImageCodeType = {
    text: string
    image: string
    timeStamp: number
}

private imgCodes: any[] = []
private imgClearTimeout?: NodeJS.Timeout

getVerificationCode() {
    const currentTime = new Date().getTime()
    const newCode: ImageCodeType[] = []
    this.imgCodes.forEach((item) => {
        if (currentTime - item.timeStamp < 60000) {
            newCode.push(item)
        }
    })
    let imgInfo: ImageCodeType
    if (newCode.length < 10) {
        const captchaCode = svgCaptcha.create()
        imgInfo = {
            text: captchaCode.text.toLocaleLowerCase(),
            image: captchaCode.data,
            timeStamp: new Date().getTime(),
        }
        newCode.push(imgInfo)
    } else {
        const index = Math.floor(new Date().getTime() % 10)
        imgInfo = newCode[index]
    }
    this.imgCodes = newCode

    //避免长时间占用内存,2分钟后无人使用清理
    if (this.imgClearTimeout) {
        clearTimeout(this.imgClearTimeout)
    }
    this.imgClearTimeout = setTimeout(() => {
        this.imgCodes.length = 0
        this.imgClearTimeout = void 0
    }, 120000)

    return imgInfo.image
}

校验一下,设置了id就拿到对应的再校验即可,这里就直接满足其中一个即可

js 复制代码
//我们对比一下
const code = params.verification_code.toLocaleLowerCase()
if (!this.img_code.find((e) => e.text === code)) {
    return throw '请输入正确的验证码'
}
相关推荐
网络点点滴18 小时前
简述Node.js运行时核心架构
架构·node.js
小粉粉hhh19 小时前
Node.js(三)——模块化
node.js
晓杰'20 小时前
从0到1实现 Balatro 游戏后端(1):项目规划与牌型判断实现
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
@PHARAOH20 小时前
WHAT - npm和corepack
前端·npm·node.js
MPGWJPMTJT20 小时前
从 Volta 迁移到 mise:Windows 下 Node 版本管理切换记录
前端·node.js
zhangfeng113320 小时前
Remotion 渲染视频脚本 ,自动化编辑视频 Node.js 层面是“单线程 JS”,但在实际渲染时是“高度并行”的。
node.js·自动化·音视频
羽师21 小时前
Node.js和npx关系
node.js
灵魂学者21 小时前
使用 Electron 打包项目构建 .EXE 桌面应用程序(简)
electron·node.js·vue·build·桌面应用程序
右耳朵猫AI21 小时前
Node.js技术周刊 2026年第14周
node.js
gogoing1 天前
Node.js 模块查找策略(require 完整流程)
javascript·node.js