Node.js+Express+mongoDB 实现邮箱注册

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 前言很多网站都会有用户注册这一个功能模块,其中大多数网站都会让用户填写手机号,然后通过手机验证码来实现用户的注册。但是大家都知道手机验证码都会收取一定的费用,所以有一些网站可能资金不够,但是又想尽大可能的留住用户,所以他们就采用使用邮箱验证码的方式来进行注册。

1.采用的技术栈


前端:vue2.x

后端:Express+mongoose

数据存储:mongodb


2.整体实现思路


(1)前端收集用户信息,包括邮箱。

(2)用户点击获取邮箱验证码,调取后端获取验证码的接口。

(3)后端生成随机验证码,发送到用户邮箱,且将此验证码保存到数据库中,并设置一定的失效时间。

(4)用户填写验证码,调用注册接口。

(5)后端接收验证码,与数据库中相对比,成功则注册,否则验证码错误。


3.具体实现代码


(1)在express项目中安装邮件发送模块中间件

npm install nodemailer
npm install nodemailer-smtp-transport


(2)定义获取验证码接口

我的项目对路由进行了封装,在routes文件夹下面新建了route.js文件,作为路由入口,定义获取验证码接口如下:

//routes/route.js
const user = require("./user"); // 用户相关路由模块
router.post("/user/emailCode", user.emailCode); // 获取邮件验证码


(3)编写获取验证码接口方法

//routes/user.js
const User = require("../database/models/user"); // 用户数据库模型
const Code = require("../database/models/code"); // 验证码数据库模型
const nodemailer = require("nodemailer"); // 邮件发送模块
const smtpTransport = require("nodemailer-smtp-transport");
const user = {
  // 获取邮箱验证码
  emailCode: async (req, res) => {
    /*邮件发送的基本配置*/
    const transport = nodemailer.createTransport(
      smtpTransport({
        host: "smtp.163.com", // 服务,这里使用的是163邮箱
        port: 465, // smtp端口,默认就是此 端口
        secure: true,
        auth: {
          user: "xxx@163.com", //发件人邮箱,即你的邮箱
          pass: "xxxxxxxx", // SMTP授权码,需要邮箱设置中获取
        },
      })
    );
    /* 生成验证码 */
    const randomFns = () => {
      // 生成6位随机数
      let code = "";
      for (let i = 0; i < 6; i++) {
        code += parseInt(Math.random() * 10);
      }
      return code;
    };
    const regEmail =
      /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; //验证邮箱正则
    /* 发送验证码 */
    let EMAIL = req.body.email;
    if (regEmail.test(EMAIL)) {
      let code = randomFns();
      transport.sendMail(
        {
          from: "lhqhacker@163.com", // 发件邮箱
          to: EMAIL, // 收件列表
          subject: "验证你的电子邮件", // 标题
          html: `
            <p>你好!</p>
            <p>您正在注册小猪社区账号</p>
            <p>你的验证码是:<strong style="color: #ff4e2a;">${code}</strong></p>
            <p>***该验证码10分钟内有效***</p>`, // html 内容
        },
        function (error, data) {
          if (error) {
            transport.close(); // 如果没用,关闭连接池
          }
        }
      );
      /* 存储验证码到数据库中 */
      const e_mail = EMAIL;
      await Code.deleteMany({ e_mail });
      const [data] = await Code.insertMany({ e_mail, code: code });
      setTimeout(async () => {
        //10分钟后失效,即删除验证码
        await Code.deleteMany({ e_mail });
      }, 1000 * 60 * 10);
      res.json(res.setUnifyResFormat(null, "00000", "邮件发送成功"));
    } else {
      res.json(res.setUnifyResFormat(null, "E0001", "邮件格式错误"));
    }
  },
};
module.exports = user;

上面代码中只有一个emailCode方法,目的就是使用我们自己的邮箱发送验证码到用户的邮箱中去,其中涉及到有mongoose的知识需要小伙伴们自己去学习了,也可以在评论区留言。


(4)前端调用注册接口

//routes/user.js
const User = require("../database/models/user"); // 模型
const Code = require("../database/models/code");
const tokenSetAndVer = require("../utils/token"); // 设置token和校验token
const bcryptjs = require("bcryptjs"); // 密码加密
// 邮件发送模块
const nodemailer = require("nodemailer");
const smtpTransport = require("nodemailer-smtp-transport");
const user = {
  // 注册
  register: async (req, res) => {
    /* 前端传来的基本信息 */
    const username = req.body.username;
    const e_mail = req.body.email;
    const code = req.body.code;
    const password = req.body.password;
    const vire = await Code.findOne({ e_mail, code }); // 检验验证码
    if (!vire) {
      res.json(res.setUnifyResFormat(null, "U0001", "验证码填写错误!"));
      return;
    }
    /* 如果验证码校验通过,则校验用户信息 */
    User.findOne(
      {
        email: e_mail,
      },
      (err, doc) => {
        if (doc) {
          res.json(res.setUnifyResFormat("", "U0001", "邮件已被注册了!"));
          return;
        }
        // 保存用户注册的信息到数据中
        let user = new User({
          username: username,
          password: password,
          email: e_mail,
        });
        // 保存用户
        user.save(async (err, doc) => {
          if (err) {
            res.json(res.setUnifyResFormat(null, "D0001", err));
          } else {
            Code.deleteMany({ e_mail }); // 删除验证码
            // 生成token
            const token = await tokenSetAndVer.setToken(user.uid, user.role);
            res.setHeader("Authorization", "Bearer " + token);
            res.json(res.setUnifyResFormat(doc, "00000", "注册成功"));
          }
          return;
        });
      }
    );
  },
};
module.exports = user;


上面代码同样编写在user.js文件中,这个方法主要的作用就是校验验证码、生成token、存储用户到数据库中,对于token方面的之后我后续在补充。


总结


到这里邮箱验证码注册的功能基本算是实现了,这里主要借助了两个中间件。整个流程不算太复杂,还不赶紧运用到你的网站中去,有问题欢迎评论区留言。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
|
3月前
|
JSON JavaScript 前端开发
超级实用!详解Node.js中的util模块和express模块
超级实用!详解Node.js中的util模块和express模块
|
4月前
|
开发框架 JSON JavaScript
Node.js教程-express框架
Node.js教程-express框架
39 1
|
4月前
|
NoSQL JavaScript 前端开发
如何使用 Node.js 连接和操作 MongoDB 数据库?
如何使用 Node.js 连接和操作 MongoDB 数据库?
237 2
|
5月前
|
前端开发 NoSQL MongoDB
一款基于Nodejs+express+mongodb的内容管理系统
一款基于Nodejs+express+mongodb的内容管理系统
68 0
|
1月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
19 0
|
2月前
|
NoSQL JavaScript 前端开发
深入浅出:使用Node.js和MongoDB构建RESTful API
在当今的软件开发领域,构建高效、可扩展的Web服务已成为开发者的重要任务之一。本文将引导读者通过现代JavaScript环境——Node.js,搭配流行的NoSQL数据库MongoDB,一步步构建一个RESTful API。不同于常规的摘要,我们将采用故事化的方式,通过一个虚构的应用“BookFinder”的开发旅程,带领读者理解API设计、数据库交互及安全性考量等关键知识点。无论你是前端工程师希望深化后端知识,还是后端新手寻求实践机会,本文都将提供你所需的指南和启示。
|
2月前
|
开发框架 JavaScript 前端开发
比较两个突出的node.js框架:koa和express
接上文讲述了 koa框架,这边文章比较一下这两个突出的node.js框架:koa和express
|
3月前
|
NoSQL JavaScript 数据库连接
超级实用!详解Node.js中的mongodb模块和socket.io模块
超级实用!详解Node.js中的mongodb模块和socket.io模块
|
3月前
|
JavaScript 前端开发 中间件
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
114 0