1. 封装邮件发送模块

之前分享node时分享了通过node如何发送邮件,为了提高复用性,这里对邮件发送进行封装

日常邮箱注册是给注册人的邮箱发送一个随机验证码,因此我们可以将收件人邮箱验证码做为传递参数

于是有了下面的一段代码...

const nodemailer = require("nodemailer");
// 创建发送邮件的对象
let transporter = nodemailer.createTransport({
    host: "smtp.163.com",   // 发送方用的邮箱
    port: 465,                     // 端口号
    secure: true, // true for 465, false for other ports
    auth: {
        user: 'qishengchengg@163.com', // 发送方的邮箱地址
        pass: '自己设置自己的'  //  mpt 验证码
    }
});

//发送邮件

function send(mail,code){
    // 邮件信息
    let mailObj ={
        from: '"假装是个服务器" <qishengchengg@163.com>', // sender address
        to: mail, // list of receivers
        subject: "注册验证", // Subject line
        text: `你的验证码是${code},有效时间五分钟.` // plain text body
    };
    return new Promise((resolve,reject) => {
        transporter.sendMail(mailObj , (err,data) => {
           if (err){
               reject();
           } else {
               resolve();
           }
        });
    })
}
  1. 封装schema

在登录注册时都会用到schema对象,为了方便对schema进行一个封装,在完成封装以后将其转换成数据模型暴露出去即可。

const mongoose = require ('mongoose');
let  Schema = mongoose.Schema;  //通过mongoose来获取schema

let  userSchema = new Schema({
    'user' : {type : String , require : true},
    'pwd' : {type : String , require: true},
    'age' : Number,
    'sex' : {type : Number , default : 0}
});
// schema创建完是不能用的  要转化为数据模型
let User = mongoose.model('user' , userSchema);  //该数据对象和集合相关联 {'集合名' , schema对象}
module.exports = User;

这样我们在使用的时候直接引入便可以使用,这样很轻便。

  1. 搭建接口

在这里需要理一下思路,在使用邮箱验证码注册的时候,步骤如下

  • 请求验证码接口时,给请求的邮箱发送验证码
  • 后端将验证码存起来
  • 对验证码进行比对,如果验证码核实正确,才会用到请求数据库,判断该邮箱在数据库中是否存在,存在返回已存在,如果不存在便进行存库,返回注册成功

理清思路以后,接口便可以轻松搭建

#### 验证码接口

router.post('/mail',(req,res) => {   //邮箱验证码
    let {mail} = req.body;
     // 产生随机验证码
    getMail.send(mail,code).then( () =>{
        redis[mail] = code;
        console.log(redis);
        res.send('验证码发送成功');
    }).catch(() => {
        res.send('验证码发送失败');
    });
});

上面关于验证码的存储方式,在开发中用到的是redis,也可以用数据库存起来,但是没必要,为了演示方便起见,我把他存在了内存中。

#### 注册接口

router.post('/reg' , (req ,res) => {  // 注册接口
   let {user,pwd,code} = req.body;
   console.log(redis[user]);
   User.find({user}).then( data => {
       if (data.length > 0){
           console.log(data)
           res.send('用户已存在');
       } else {
           //要判断验证码是否ok
          if (redis[user] == code){
              User.insertMany({user:user , pwd:pwd}).then(() => {
                  res.send('注册成功');
              }).catch(err => {
                  res.send('注册失败');
              });
          } else {
              res.send('验证码错误');
          }
       }
   }).catch( err => {
       res.send('意外的错误');
   })
});

#### 登录接口

router.post('/login' , (req , res) => {
    let {user,pwd} = req.body;
    User.find({user,pwd}).then( data => {
        if (data.length > 0){
            res.send('登录成功');
        } else {
            res.send('用户名或密码不正确');
        }
    }).catch( err => {
        res.send('意外的错误');
    })
});

至此,邮箱验证码注册结束。

  1. Apidoc

在前后端分离框架中,API文档频繁交接。如果涉及到第三方接口调用,多方合作场景下,API和文档变更可能会更快。为了方便维护API和交接文档,这里给大家推荐一款文档生成工具 - apidoc

官方文档

Last modification:April 8th, 2020 at 03:00 pm
来杯coffee吧