node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)

⭐前言

大家好,我是yma16,本文分享关于node实战——koa给邮件发送验证码缓存到redis。

本文适用对象:前端初学者转node方向,在线大学生,应届毕业生,计算机爱好者。

node系列往期文章

node_windows环境变量配置

node_npm发布包

linux_配置node

node_nvm安装配置

node笔记_http服务搭建(渲染html、json)

node笔记_读文件

node笔记_写文件

node笔记_连接mysql实现crud

node笔记_formidable实现前后端联调的文件上传

node笔记_koa框架介绍

node_koa路由

node_生成目录

node_读写excel

node笔记_读取目录的文件

node笔记——调用免费qq的smtp发送html格式邮箱

node实战——搭建带swagger接口文档的后端koa项目(node后端就业储备知识)

node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)

邮件smtp

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是一种用于发送电子邮件的网络协议,它定义了客户端与服务器端之间的通信规则,以保证电子邮件能够准确、高效地发送。SMTP协议最初由RFC 821定义,后来又有RFC 2821、RFC 5321等对其进行了更新和完善。

SMTP协议的基本原理是:发送邮件的客户端将邮件内容发送至SMTP服务器,SMTP服务器再将邮件转发到接收方的邮箱服务器,最终接收方通过POP3或IMAP等协议来下载邮件。SMTP协议采用典型的客户端-服务器模型,客户端向服务器发送请求,服务器响应请求,双方通过交互式消息传输实现通信。

SMTP协议包括邮件格式、邮件地址、邮件传输、错误处理等方面的内容,其主要特点是简单、灵活、可扩展。SMTP协议在互联网上一直得到广泛应用,而且随着电子邮件的快速发展,SMTP协议也在不断改进和完善。

redis是什么

Redis是一个开源的内存数据库系统,其名称是REmote DIctionary Server的缩写。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis数据可以被持久化到磁盘,以保证数据的可靠性和持久性。

Redis最大的特点是快速读写,因为数据都存储在内存中,可以快速地访问。此外,Redis还提供了各种高级功能,如发布/订阅、Lua脚本、事务等。

Redis还可以作为缓存服务器使用,可以缓存各种类型的数据,以提高应用程序的性能。Redis还具有伸缩性好,支持分布式架构,可以进行集群部署,以满足大规模高并发的需求。

⭐koa 封装发送邮件api

原理:

在koa调用smtp服务实现发送邮件

💖 引用qq的免费smtp服务

在qq邮箱的账号模块配置smtp验证码

💖 nodemailer库发送邮件

koa封装的 sendEmail方法

const nodemailer = require('nodemailer')
//创建一个SMTP客户端配置对象
const transporter = nodemailer.createTransport({
    // 默认支持的邮箱服务包括:”QQ”、”163”、”126”、”iCloud”、”Hotmail”、”Yahoo”等
    service: "QQ",
    auth: {
        // 发件人邮箱账号
        user: '***@qq.com',
        //发件人邮箱的授权码 需要在自己的邮箱设置中生成,并不是邮件的登录密码
        pass: '***'
    }
})
const sendEmail=(toUserEmail,title,content)=>{
    return new Promise(resolve=>{
        // 配置收件人信息
        const receiver = {
            // 发件人 邮箱  '昵称<发件人邮箱>'
            from: `***@qq.com`,
            // 主题
            subject:title,
            // 收件人 的邮箱 可以是其他邮箱 不一定是qq邮箱
            to:toUserEmail,
            // 可以使用html标签
            html: content
        };
        // 发送邮件
        transporter.sendMail(receiver, (error, info) => {
            if (error) {
                resolve({
                    code:0,
                    msg:error
                })
            }
            transporter.close()
            resolve({
                code:200,
                msg:'success'
            })
        })
    })
};
module.exports={
    sendEmail
}

⭐koa 连接redis

node运行环境连接redis服务

💖 下载redis

下载redis

https://redis.io/download/

运行redis.exe

💖 ioredis 库连接redis

npm install ioredis

官方使用示例

// Import ioredis.
// You can also use `import { Redis } from "ioredis"`
// if your project is a TypeScript project,
// Note that `import Redis from "ioredis"` is still supported,
// but will be deprecated in the next major version.
const Redis = require("ioredis");
// Create a Redis instance.
// By default, it will connect to localhost:6379.
// We are going to cover how to specify connection options soon.
const redis = new Redis();
redis.set("mykey", "value"); // Returns a promise which resolves to "OK" when the command succeeds.
// ioredis supports the node.js callback style
redis.get("mykey", (err, result) => {
  if (err) {
    console.error(err);
  } else {
    console.log(result); // Prints "value"
  }
});
// Or ioredis returns a promise if the last argument isn't a function
redis.get("mykey").then((result) => {
  console.log(result); // Prints "value"
});
redis.zadd("sortedSet", 1, "one", 2, "dos", 4, "quatro", 3, "three");
redis.zrange("sortedSet", 0, 2, "WITHSCORES").then((elements) => {
  // ["one", "1", "dos", "2", "three", "3"] as if the command was `redis> ZRANGE sortedSet 0 2 WITHSCORES`
  console.log(elements);
});
// All arguments are passed directly to the redis server,
// so technically ioredis supports all Redis commands.
// The format is: redis[SOME_REDIS_COMMAND_IN_LOWERCASE](ARGUMENTS_ARE_JOINED_INTO_COMMAND_STRING)
// so the following statement is equivalent to the CLI: `redis> SET mykey hello EX 10`
redis.set("mykey", "hello", "EX", 10);

封装redis

const Redis = require('ioredis')
// 创建 Redis 客户端实例, 连接指定的 Redis 服务器
const redis = new Redis({
  port: 6379, // redis服务器默认端口号
  host: '127.0.0.1' // redis服务器的IP地址
})

⭐koa封装的api

发送邮件api配置文件

const Router = require('koa-router');
const router = new Router();
const {sendEmail}=require('../../utils/email/index');
const {getRedisKey,setRedisConfig}=require('../../utils/redis/index');
// 随机字符串
function randomString(length) {
    const chars='0123456789'
    let result = '';
    for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
    return result;
}
// 发送邮件验证码
router.post('/getEmailCode', async (ctx) => {
    try{
        const bodyParams =  ctx.request.body
        const {email}=bodyParams
        const code=randomString(4)
        const content=`<p>验证码:<span style="color:lightskyblue">${code}</span><p>`
        const title='欢迎注册!'
        setRedisConfig(email,code)
        const res=await sendEmail(email,title,content)
        ctx.body = {
            code:res.code,
            data:{
                emailRes:res,
                code:await getRedisKey(email)
            },
            msg:'success'
        };
    }
    catch(r){
        ctx.body={
            code:0,
            msg:r
        }
    }
});
module.exports = router;

⭐postman+redismanager验证

postman生成验证码发送邮件

qq邮件收到验证码 7680

redis查看邮箱的key值为7680

数据一致验证成功!

⭐总结

redis的特性

Redis是一个内存数据存储系统,它提供了一系列特性,可以被用于缓存、消息队列、计数器等多个应用场景。以下是Redis的一些特性和其应用场景:

  1. 快速的键值存储:Redis的主要功能是存储键值对数据,支持多种数据类型(字符串、哈希、列表、集合、有序集合等),存取速度非常快。这使它非常适合作为缓存系统。
  2. 发布订阅模式:Redis支持发布订阅模式,可以让多个消费者订阅一个或多个频道,生产者向频道发送消息,消费者接收消息并做出相应的处理。这个特性常用于构建消息队列系统。
  3. 事务支持:Redis支持事务操作,可以将多个命令打包成一个事务,然后一起执行,这样可以保证操作的原子性。
  4. 持久化:Redis提供了两种持久化方式,即RDB快照和AOF日志。RDB快照可以将内存中的数据保存到磁盘上,AOF日志则记录每个写操作,用于系统恢复。
  5. 分布式锁:Redis可以使用基于SETNX命令的方式实现简单的分布式锁。这种锁的实现比较轻量级,适合于对性能要求较高的场景。
  6. 计数器:Redis支持对指定键值进行原子增减操作,可以用来实现计数器等功能。

本文主要是使用了redis得快速键值对来存储邮件对应得验证码,同理手机发送邮件验证码也可以采用该方案。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
29天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js:从零开始构建后端服务
【10月更文挑战第42天】在数字时代的浪潮中,掌握一门后端技术对于开发者来说至关重要。Node.js,作为一种基于Chrome V8引擎的JavaScript运行环境,允许开发者使用JavaScript编写服务器端代码,极大地拓宽了前端开发者的技能边界。本文将从Node.js的基础概念讲起,逐步引导读者理解其事件驱动、非阻塞I/O模型的核心原理,并指导如何在实战中应用这些知识构建高效、可扩展的后端服务。通过深入浅出的方式,我们将一起探索Node.js的魅力和潜力,解锁更多可能。
|
25天前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
44 1
|
23天前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
20天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
23天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
19天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
22天前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
23天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
17 4
|
26天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
28天前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
47 1