注册页验证码---nodejs

应用nodejs来写一个注册页的验证码

首先,先安装nodemailer模块
bash命令 npm i nodemailer -S
nodemailer官网 https://nodemailer.com/
官网有模板代码 直接拷贝,进行删减自己所需

我的验证码文件夹目录
在这里插入图片描述
./lib/file.js
自定义的读写文件模块

const fs = require('fs');
const path = require('path');

function readFile() {
    return new Promise((resolve, reject) => {
        fs.readFile(path.join(__dirname, '..', ...arguments), 'utf8', (err, data) => {
            if (err) reject(err);
            resolve(data);
        });
    });
}

function writeFile() {
    return new Promise((resolve, reject) => {
        let url = Array.from(arguments);
        let data = url.shift();
        fs.writeFile(path.join(__dirname, '..', ...url), data, err => {
            if (err) reject(err);
            resolve('ok');
        });
    });
}

module.exports = { readFile, writeFile };

./public/html/reg.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <div class="container">
        <h1 class="text-center">注册页面</h1>
        <div class="input-group">
            <span class="input-group-addon" id="basic-addon1">用户名</span>
            <input type="text" class="form-control" placeholder="username" id="username" aria-describedby="basic-addon1">
        </div>
        <div class="input-group">
            <span class="input-group-addon" id="basic-addon2">密  码</span>
            <input type="text" class="form-control" placeholder="password" id="password" aria-describedby="basic-addon2">
        </div>
        <div class="input-group">
            <span class="input-group-addon" id="basic-addon4">邮箱</span>
            <input type="text" class="form-control" placeholder="email" id="email" aria-describedby="basic-addon4">
        </div>
        <button class="btn btn-info btn-block" id="getcode">获取验证码</button>
        <div class="input-group">
            <span class="input-group-addon" id="basic-addon3">验证码</span>
            <input type="text" class="form-control" placeholder="checkcode" id="checkcode" aria-describedby="basic-addon3">
        </div>
        <button type="button" id="reg" class="btn btn-success btn-block">注册</button>
    </div>

    <script>
        $(function() {
            //点击获取验证码按钮 发送ajax请求
            $('#getcode').on('click',function(){
                $.ajax({
                    type:'post',
                    url:'http://localhost:8888/getcode',
                    data:{
                        email:$('#email').val()
                    },
                    dataType:'json',
                    success:function(res){
                        console.log(res);
                    }
                })
            })

            //点击注册按钮 发送ajax请求
            $('#reg').on('click', function() {
                $.ajax({
                    type: "post",
                    url: "http://localhost:8888/reg",
                    data: {
                        username: $('#username').val(),
                        password: $('#password').val(),
                        email:$('#email').val(),
                        code:$('#checkcode').val()
                    },
                    dataType: "json",
                    success: function(res) {
                        console.log(res);
                    }
                });
            });
        });
    </script>
</body>

</html>

注册页点击获取验证码按钮发送发送一次ajax请求,将填写的邮箱发送给后端;
点击注册再发送一次ajax请求,将注册的信息发送给后端

./server.js
注意:这是最主要的代码文件,看注释

const http=require('http');
const path=require('path');
const nodemailer=require('nodemailer');
const querystring=require('querystring');
const {readFile,writeFile}=require('./lib/file');
const fs=require('fs');


//--------------------------------------nodemailer部分
let user={
    name:'982455869@qq.com',
    pass:'jxlfhseptukjbbij'
}

// 使用默认的SMTP传输方式 创建可以复用的传输对象
let transporter = nodemailer.createTransport({
host: "smtp.qq.com",//主机名
port: 465,// 端口号
secure: true, // true for 465, false for other ports
auth: {
    user: user.name, // 用户名
    pass: user.pass, // 密码
},
});

let emailObj={
        from: '"zhangsan" <123456@qq.com>', // 发件人(这里填写发件人邮箱)
        to: "123456@qq.com",  // 收件人(这里填写收件人邮箱)
        subject: "验证码", // 主题
        // text: "Hello world?", // 文本内容
        html: "<b>Hello world?</b>", // html内容
    }

//-------------------------------------------------------

//创建一个服务
http.createServer((req,res)=>{
    if(req.url==='/favicon.ico') return;//系统自带的一个请求,给他去掉
    console.log(`${req.method} ${req.headers.host}${req.url}`);//打印请求的方式 以及主机和路径

    res.writeHead(200,{"content-type":"text/html;charset=utf-8"});

    if(req.method==='GET'){//web服务 用于页面渲染
        //路由
        switch(req.url){
            case '/reg'://渲染注册页
                readFile('public','html','reg.html').then(function(data){
                    res.end(data);
                })
                break;

        }
    }else{//接收post请求
        //API服务 数据接口
        switch(req.url){
            case '/getcode':
                req.on('data',chunk=>{//当请求到数据,进行打印数据
                    let data=querystring.parse(chunk.toString());
                    // console.log(data);//打印结果{ email: '填写在注册页的邮箱' }
                    let code=getCode();//获取验证码

                    emailObj.to=data.email;// 收件人
                    emailObj.html=`<h1>您的验证码是:${code}</h1>`;//发送到内容

                    // 用定义的传输对象发送邮件
                    let info = transporter.sendMail(emailObj,(err,info)=>{
                        if(err) console.log(err);
                        console.log('邮件发送成功');
                    });

                    //发送成功以后记录验证码---用文件读写的方式存储
                    writeFile(code,'temp',data.email);
                })
                break;
            case '/reg':
                req.on('data',chunk=>{
                    let value=querystring.parse(chunk.toString());
                    // console.log(value);
                    /* [Object: null prototype] {
                        username: 'zhangsan',
                        password: '123',
                        email: '自己填写的邮箱',
                        code: '6bZbJU'
                    } */
                    //读temp文件中的验证码和前端发来的验证码进行比较
                    readFile('temp',value.email).then(function(data){
                        if(data===value.code){
                            res.end('{"msg":"验证成功"}');
                            //注册成功后过10s删除temp中的验证码文件
                            let timer=setTimeout(function(){
                                fs.unlink(`./temp/${value.email}`,err=>{
                                    err && console.log(err);
                                    console.log('文件删除成功');
                                });
                                clearTimeout(timer);
                            },10000);
                        }else{
                            res.end('{"msg":"验证失败"}');
                        }
                    });
                })
                break;
        }
    }


}).listen(8888,()=>{//监听服务
    console.log('server is running on http://localhost:8888');
})


//----------------------------------------------------------

function random(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

//验证码函数
function getCode() {
    var code = '';
    for (var i = 0; i < 6; i++) {
        var type = random(1, 3);
        switch (type) {
            case 1:
                code += String.fromCharCode(random(48, 57)); //数字
                break;
            case 2:
                code += String.fromCharCode(random(65, 90)); // 大写字母
                break;
            case 3:
                code += String.fromCharCode(random(97, 122)); // 小写字母
                break;
        }
    }
    return code;
}

思路
1.创建服务
2.渲染注册页面 前端发送ajax请求发送邮箱,后端接受到发送过来的email,然后进行发送验证码的操作
3.后端如何获取发送的验证码?
发送成功以后记录验证码。用文件读写的方式来记录,用邮箱名作为文件名,存入temp文件夹中(这样的好处是方便记录和查找)
4.前端点击注册按钮,发送ajax请求,存入temp中的验证码与前端ajax发送过来的验证码数据进行比较;
当两者相等是,返回给前端验证成功的响应,并且10s后删除temp对应的验证码文件;否则,验证失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值