(express-session踩坑)NodeJS后台接口-邮箱验证码验证注册功能实现

  1. 下载express-session,nodemailer

    npm i -s express-session // express的中间件
    npm i -s nodemailer // 邮箱验证插件 配置方法在官网可以看  下面的代码也有现成的
    
  2. 在app.js下引入express-session

    var session = require('express-session');
    // 配置session(需要配置在路由之前)
    app.use(session({
      secret: '$#%$%$%',
      name: 'sessionId',
      resave: false,
      saveUninitialized: false,
      cookie: { maxAge: 1000*60*60 }
    }));
    
  3. 在验证接口中将验证码和邮箱保存进sessionStore中

    var email = req.query.email;
    var verify = Email.verify;
    
    // 数据持久化
    req.sessionStore.verify = verify;
    req.sessionStore.email = email;
    
    var mailOptions = {
      from: '<[email protected]>',
      to: email,
      subject: "喵喵网邮箱验证码",
      text: "验证码" + verify
    }
    
    ----------------------这一部分代码封装到js文件中再引入使用-----------------------------
    var nodemailer = require('nodemailer')
    
    var Email = {
      config: {
        host: "smtp.qq.com", // 使用什么邮箱就用什么后缀
        port: 587,
        auth: {
          user: '[email protected]', // 用户名
          pass: 'ppzfgyqfowjhhefd' // 密钥(QQ邮箱的授权码)
        }
      },
      get transporter () {
        return nodemailer.createTransport(this.config)
      },
      get verify () {
        return Math.random().toString().substring(2,6)
      }
    }
    
    module.exports = {
      Email
    }
    ----------------------------------------------------------------------------------------
    var { Email } = require('上面封装的js文件路径') // 写在接口函数外
    
    Email.transporter.sendMail(mailOptions,(err) => {
      if (err) {
        res.send({
          msg: '验证码发送失败' + err,
          status: -1
        })
      } else {
        res.send({
          msg: '验证码发送成功' + req.sessionStore.email + req.sessionStore.verify,
          status: 0
        })
      }
    })
    
  4. 在注册接口中验证

    var { username, password, email, verify } = req.body;
    
    console.log(req.sessionStore);
    
    if (email !== req.sessionStore.email || verify !== req.sessionStore.verify) {
      res.send({
        msg: "验证码错误" + req.sessionStore.email + req.sessionStore.verify,
        status: -1
      });
      return
    }
    
    ---------------------------------这一部分代码封装到models下的js文件中------------------------------------------
    // 引入mongoose
    var mongoose = require('mongoose')
    // mongoose.set('useCreateIndex', true)
    mongoose.set('useCreateIndex',true);
    
    var UserSchema = new mongoose.Schema({
      username: { type: String, required: true, index: { unique: true } }, // unique是唯一值
      password: { type: String, required: true },
      email: { type: String, required: true, index: { unique: true } },
      date: { type: Date, default: Date.now() }
    })
    
    var UserModel = mongoose.model('user', UserSchema)
    
    UserModel.createIndexes() // 使唯一值生效
    
    var save = (data) => {
      var user = new UserModel(data)
      return user.save()
        .then( () => { // 添加成功
          return true
        })
        .catch( () => { // 添加失败
          return false
        })
    }
    module.exports = {
      save
    }
    -------------------------------------------------------------------------------------------------------------
    //在路由js文件中引入上面封装的js文件
    var UserModel = require('../models/users'); // 记得不要写在接口函数内
    
    var result = await UserModel.save({
      username,
      password,
      email
    });
    
    if (result) {
      res.send({
        msg: '注册成功',
        status: 0
      });
    } else {
      res.send({
        msg: '注册失败',
        status: -2
      })
    }
    
  5. 使用session踩坑

    无法获取req.session中的值

    目前无法通过req.session来处理数据持久化操作,因为不同的接口函数调用时所获取到的session不一样。可以理解为当新接口获取session时会生成一个新的session,故而在上一个接口中储存在session中的值无法在新接口内获取,因为根本不是同一个session。所以在上面处理数据持久化操作时是通过sessionStore实现的。

你可能感兴趣的:(学习,踩坑)