华为函数工作流云函数操作云MySQL数据库实现邮箱验证码发送以及校验

云函数环境为 nodejs12.13
云数据库为MySQL数据库
云数据库开通使用不再多提 购买云数据库即可
不再使用dmhsq-mysql-db改为 dmhsq-mysql-pool

部署邮件发送服务

上一篇文章 我们已经讲了 如何实现邮件发送
使用华为云函数实现邮件发送

配置数据库

这里我用的 navicat fro mysql
表结构如下
email 邮箱
code 验证码
state 状态
check_time 过期时间

图片.png

state为0为未验证
state为1为已经验证 代表失效
check_time大于当前时间则为有效 小于为已经失效
本地安装依赖

重复上个文章我们本地安装依赖再上传代码

npm install dmhsq-mysql-pool
npm install nodemailer

index.js文件编写逻辑

首先 用户如果只输入邮箱 则为 获取验证码
验证码生成 并进入数据库
发送邮件
如果用户 输入了邮箱和验证码 则进行校验
取最新验证码进行校验
如果已经校验就返回已经验证
如果未验证就校验
如果检验失败看看是否超时 超时为失效
剩下的情况为验证码输入错误

代码如下

const transporter = require("./email.js")
const database = require("dmhsq-mysql-pool")
exports.handler = async function(event, context, callback) {

	let email = event.queryStringParameters.email;
	let code = event.queryStringParameters.code
	let db = new database({
		host: 'xxxx',
		port: 'xxxx',
		user: 'xxxx',
		password: 'xxxx',
		database: "xxxx"
	})
	let collection = db.table("email")
	let response = {
		'statusCode': 200,
		'isBase64Encoded': false,
		'headers': {
			'Content-type': 'application/json'
		},
		'body': `'{"key": ${JSON.stringify(event.queryStringParameters)}}'`
	}

	if (!email) {
		response.body = `'{"key": "请输入正确邮箱"}'`
		callback(null, response);
	} else if (!code) {
		
		const randomStr = '00000' + Math.floor(Math.random() * 1000000)
		const codes = randomStr.substring(randomStr.length - 6)
		const time = 300;
		const check_time = parseInt(Date.parse(new Date()).toString().substr(0, 10))+time;
		
		let d = await collection.add({
			email,
			code: codes,
			check_time,
			state:0
		}).get()
		if(d.code===0){
			response.body = `{"code": 0}`
			const message = {
						  from: "验证码<xxxxxx@xx.com>",
						  to: email,
						  subject: "验证码服务",
						  html: `<html>
						<head>
							<meta charset="utf-8">
							<title></title>
						</head>
						<body>
							<div>
								<p style="font-size: 20px;">欢迎您使用,您的验证码为 
								<span style="color: blue;font-size: 30px;font-weight: 800;">${codes}</span> ,有效时间为${time/60}分钟, 请勿泄露并及时验证</p>
	
								<div style="margin-top: 50px;"></div>
								<p style="color: red;font-size: 25px;">请勿回复</p>
							</div>
						</body>
					</html>`
					};
					await transporter.sendMail(message)
		}else{
			response.body = `{"msg": 请稍后重试}`
		}
		callback(null, response);
	}else{
		let result = await collection.where({email,code}).sort({check_time:"DESC"}).get();
		let data = result.data;
		if(data.length==0){
			response.body = `{"key": "验证码错误"}`
		}else{
			data = data[0]
			const check_times = parseInt(Date.parse(new Date()).toString().substr(0, 10));
		if(data.state==0&data.check_time>check_times){
			await collection.updata({state:1}).where({email}).get()
			response.body = `{"key": "验证通过"}`
		}else if(data.check_time<check_times){
			response.body = `{"key": "验证码失效"}`
		}else if(data.state==1){
			response.body = `{"key": "验证码已经验证"}`
		}else{
			response.body = `{"key": "验证码错误"}`
		}
		}
		
		callback(null, response);
	}

	callback(null, response);
}

创建触发器

图片.png

测试

这里在浏览器中使用触发器提供的地址即可

发送请求
图片.png

收到邮件
图片.png

验证
图片.png

再次验证
图片.png

失效
图片.png

数据库数据
图片.png

文章来源: bbs.huaweicloud.com/blogs,作者:代码哈士奇,版权归原作者所有,如需转载,请联系作者。

原文链接:bbs.huaweicloud.com/blogs/250514

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码哈士奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值