Node(十)之Mongoose配合Node路由实现邮箱注册登录(Post版)

简介: Node(十)之Mongoose配合Node路由实现邮箱注册登录(Post版)

首先新建一个HTML:(引入jq)

<!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="./jquery.js"></script>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      div:nth-child(3) {
        display: none;
      }
      input {
        display: block;
        height: 40px;
        width: 200px;
        margin: 20px auto;
      }
      button:not(#email) {
        display: block;
        height: 30px;
        width: 70px;
        background: lightcoral;
        border: none;
        margin: 0 auto;
      }
      #email {
        display: block;
        height: 30px;
        width: 100px;
        margin: 0 auto;
      }
      ul {
        height: 50px;
        width: 200px;
        background: lightblue;
        margin: 0 auto;
        list-style: none;
      }
      li {
        height: 50px;
        width: 100px;
        float: left;
        text-align: center;
        line-height: 50px;
      }
      li:hover {
        background: lightgreen;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <ul>
      <li id="regChange">注册</li>
      <li id="loginChange">登录</li>
    </ul>
    <div id="reg">
      <input type="text" placeholder="邮箱" id="user" />
      <input type="text" placeholder="密码" id="psd" />
      <input type="text" placeholder="验证码" id="sendmail" />
      <button id="email">发送验证码</button> <button id="btn">注册</button>
    </div>
    <div id="login">
      <input type="text" placeholder="用户名" id="loguser" />
      <input type="text" placeholder="密码" id="logpsd" />
      <button id="logbtn">登录</button>
    </div>
    <script>
      //增加监听事件
      btn.addEventListener("click", clickHandler);
      logbtn.addEventListener("click", clickHandler);
      email.addEventListener("click", sendHandler);
      regChange.addEventListener("click", changeHandler);
      loginChange.addEventListener("click", changeHandler);
      function clickHandler(e) {
        if (this.textContent === "注册") {
          //若为空时跳出
          if (!user.value || !psd.value || !sendmail.value) {
            alert("不能为空");
            return;
          }
          //点击注册时将邮箱号,密码,验证码传送至后台
          $.post("http://localhost:1024/main/reg", {
              email: user.value,
              password: psd.value,
              mailnum: sendmail.value
            },
            function (res) {
              //后台返回的对象,若hasUser为真,说明已有用户名,否则注册成功
              if (res.hasUser) {
                alert("注册失败");
                return;
              } else {
                alert("注册成功~");
              }
              //成功后隐藏注册,显示登录
              reg.style.display = "none";
              login.style.display = "block";
            }
          );
        } else if (this.textContent === "登录") {
          // 同注册,不能为空
          if (!loguser.value || !logpsd.value) {
            alert("不能为空");
            return;
          }
          //点击登录时将邮箱号,密码传送至后台
          $.post("http://localhost:1024/main/login", {
              email: loguser.value,
              password: logpsd.value
            },
            function (res) {
              //后台返回的对象,若isUser为真,说明正确,并跳转至欢迎页,否则失败
              if (res.isUser) {
                alert("登录成功");
                location.href = "./welcome.html";
              } else {
                alert("用户名或密码不正确");
                return;
              }
            }
          );
        }
      }
      function sendHandler(e) {
        //   点击获取验证码后将验证码发送到后端进行比对
        $.post("http://localhost:1024/main/sendmail", {
          email: user.value
        });
      }
      function changeHandler(e) {
        //   点击上方的注册登录切换
        if (e.target.textContent === "注册") {
          reg.style.display = "block";
          login.style.display = "none";
        } else {
          reg.style.display = "none";
          login.style.display = "block";
        }
      }
    </script>
  </body>
</html>

新建set文件夹,在文件夹中新建几个js文件:

main.js(连接mongoose数据库)

const mongoose = require('mongoose');//引入mongoose
mongoose.connect('mongodb://localhost:27017/UserList', {
    useNewUrlParser: true
});//连接数据库
let db = mongoose.connection;
db.on("error", function (error) {
    console.log("错误:" + error);
});
db.on("open", function () {
    console.log("连接成功");
});
db.on('disconnected', function () {
    console.log('连接断开');
});
module.exports = mongoose;//抛出mongose对象

mod.js(实例化Schema,新建数据库)

const mongoose = require('./main');//引入main模块
const Schema = mongoose.Schema;//新建schema对象
let userSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});//实例化对象
let userModel = mongoose.model('allUser', userSchema);//新建数据库
module.exports = userModel;//抛出模块

send.js(邮件发送模块)

const nodemailer = require("nodemailer");
let obj = {
  transporter: nodemailer.createTransport({
    service: "qq", // 运营商  qq邮箱 网易//
    port: 465,
    secure: true,
    auth: {
      user: "*******@qq.com", //发送方的邮箱
      pass: "********" // pop3 授权码
    }
  }),
  send: function(mail, content,callback) {
    mailOptions = {
      from: '"Hello World~" <******@qq.com>',
      to: mail,
      subject: content,
      text: content,
      html: "<h1>" + content + "</h1>"
    };
    this.transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
        return console.log(error);
      }
      console.log("Message sent: %s", info.messageId);
      callback();
    });
  }
};
module.exports = obj;

reg.js(创建注册模块)

const express = require('express');
const router = express.Router(); //新建路由
const Model = require('./mod'); //传入数据库对象
const sendMail = require('./send'); //传入邮件发送的模块对象
var count = ""; //新建一个空字符存放验证码,可供全局调用
//用post方法传输数据
router.post('/reg', (req, res) => {
    //保存前端传来的数据
    var mail = req.body.email;
    var psd = req.body.password;
    var mailnum = req.body.mailnum;
    //使用Model对象连接数据库
    Model.find({// 查询邮箱
        'email': mail
    }).then((data) => {
        //若返回的邮箱找到或验证码不对,则抛错
        if (data.length >= 1 || mailnum !== count) {
            res.send({
                hasUser: true
            });
            return;
        }
        res.send({
            hasUser: false
        })
        Model.insertMany({//反之将邮箱插入到数据库
            'email': mail,
            'password': psd
        }).then((result) => {
            console.log(result);
        })
    }).catch((err) => {
        console.log(err);
    });
});
//邮箱验证接口
router.post("/sendmail", (req, res) => {
    count = ""; //初始化验证码容器
    var mail = req.body.email; //获取前端传来的邮箱号
    for (let i = 0; i < 4; i++) {
        count += Math.floor(Math.random() * 10); //生成4个随机数
    }
    var callback = () => {
        console.log("发送成功");
    };
    sendMail.send(mail, count, callback); //调用邮件发送模块
    res.send('send');
});
module.exports = router;

login.js(登录模块)

const express = require('express');
const router = express.Router();//新建路由
const Model = require('./mod');//获取数据库对象
router.post('/login', (req, res) => {//路由地址
    //保存前端传来的数据
    var mail = req.body.email;
    var psd = req.body.password;
    Model.find({
        // 查询是否有该用户,若用户邮箱和密码符合,则抛出正确,否则抛出错误对象
        'email': mail,
        'password': psd
    }).then((data) => {
        if (data.length >= 1) {
            res.send({
                isUser: true
            });
        } else {
            res.send({
                isUser: false
            });
        }
    }).catch((err) => {
        console.log(err);
    });
});
module.exports = router;

然后在set文件夹外面新建一个服务(server.js),将所有的模块拼接:

const express = require('express');
const app = express();
const cors = require("cors"); //引入cors模块(解决跨域问题)
var bodyParser = require('body-parser');
app.use(cors());
// 下面的类似于http请求的头文件(另一篇文章有写到http请求,也是注册登录)
app.all("*", function (req, res, next) {
    //设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "content-type"); //允许的header类型
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS"); //跨域允许的请求方式
    next(); //是否继续向下执行
});
//解决post传输的数据格式问题
app.use(bodyParser.urlencoded({
    extended: false
}))
app.use(bodyParser.json())
// 路由选择导入注册
const reg = require('../set/reg.js');
app.use('/main', reg);
// 路由选择导入登录
const login = require('../set/login.js');
app.use('/main', login);
// 开启监听
app.listen(1024, () => {
    console.log('Server Start~');
});

最后运行server.js实现注册登录

注意:案例需要用到monogoDB,Jq,mongoose模块,express模块,nodemailer模块,cors模块,

body-parser模块


相关文章
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
35 0
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(上)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
35 0
|
13天前
|
前端开发 JavaScript
【node写接口】 通过node 快速搭建一个服务器、get请求、post请求 小白入门
【node写接口】 通过node 快速搭建一个服务器、get请求、post请求 小白入门
23 4
|
2月前
|
前端开发 中间件 关系型数据库
node注册和登录你真的清楚了吗?
本文档介绍了创建MySQL数据表、安装配置MySQL模块的过程,并详细阐述了用户注册和登录的功能实现。注册功能包括表单数据校验、用户名占用检测、密码加密及用户插入。登录功能涉及密码判断、生成JWT Token以及使用express-jwt中间件进行Token解析。在整个过程中,还封装了一个错误处理函数用于统一响应错误信息。
27 2
node注册和登录你真的清楚了吗?
|
1月前
|
JavaScript
Node.js 路由
Node.js 路由
13 3
|
1月前
|
JavaScript
Node.js GET/POST请求
Node.js GET/POST请求
12 1
|
20天前
|
JavaScript 数据安全/隐私保护
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
22 0
|
2月前
|
JSON JavaScript API
使用 Node.js 开发一个简单的 web 服务器响应 HTTP post 请求
使用 Node.js 开发一个简单的 web 服务器响应 HTTP post 请求
|
2月前
|
JavaScript 前端开发 开发者
Vue路由及Node.js环境搭建
Vue.js 和 Node.js 是两个不同的技术,分别用于前端和后端开发,具有不同的用途和功能
17 1
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
37 0