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

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

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方面的之后我后续在补充。


总结


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

相关文章
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
存储 NoSQL JavaScript
Node.js导入MongoDB具体操作指南
通过本文,您已经学会了如何在Node.js中导入MongoDB并执行基本的CRUD操作。Node.js与MongoDB的结合使得构建高效、可扩展的后端服务变得更加容易。通过遵循本文的步骤,您可以快速设置并运行一个强大的数据存储和处理系统。希望这篇指南能为您的开发工作提供实用的帮助。
392 13
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
1037 1
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
349 0
|
9月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
3001 11
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
1175 155
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
13195 23