nodejs初體驗,使用node寫一個簡易郵箱驗證註冊登陸

開門進山html

前置基礎

根據官方手冊,會使用插件 nodemail mongoose。(本文使用了mongoose,用來存數據。若沒用到數據庫,可忽略與mongoose相關的內容)node

1.目錄結構

├── server.js // 服務入口
├── db // 數據庫文件夾(沒使用mongoose能夠忽略)
│  ├── model // 
│  │  └──userModel.js // 經過mongoose得到schema對象
│  └── connect.js // 連接數據庫
├── router // 路由文件夾
│  └── userRouter.js // 路由接口
├── utils // 工具文件夾
│  └── mail.js // 郵件發送插件

image.png

2.思路詳解

必要準備redis

  1. npm init --yes
  2. npm i express
  3. npm i nodemailer

其次使用node開發必定要有模塊思想。其實本文能夠在一個server.js中完成,模塊化處理有利於提升開發效率和下降維護成本。mongodb

2.1 入口 ./server.js

首先 創建一個服務,連接數據庫,引入路由數據庫

const express = require('express')
const app = express()
const db = require('./db/connect') // 連接數據庫

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json()) // 這三行爲解析接口傳參

// 引入路由
const userRouter = require('./router/userRouter')

app.use('/user', userRouter)


app.listen(3000, ()=> {
  console.log('server start')
})

2.2 連接數據庫 ./db/connect.js

使用方法就是官方demo (系統記得安裝MongoDB)express

// 連接數據庫

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/chenjingtest',{useNewUrlParser: true,useUnifiedTopology: true})
// 連接數據庫
var db = mongoose.connection // 數據庫的連接對象
db.on('error', console.error.bind(console, 'connection error:'))
db.once('open', function() {
  console.log('數據庫連接成功')
  // we're connected!
})
2.2.1 用戶對象模塊./db/model/userMoldel.js

新建一個shecma對象
更多理解能夠移步mongoose手冊npm

const mongoose = require('mongoose')
var Schema = mongoose.Schema
// 經過mongoose得到schema對象
var userSchema = new Schema({
  us: { type: String, required: true },
  ps: { type: String, required: true },
  age: Number,
  sex: { type: Number, default: 0 }
})

var User = mongoose.model('user', userSchema) // 該數據對象和集合關聯('集合名', schema對象)

module.exports = User

2.3 路由模塊./router/userRouter.js

const express = require('express')
const router = express.Router()
const User = require('../db/model/userModel') // 引入
const mailSend = require('../utils/mail')

let codes = {} // 咱們這個例子 驗證碼就放着內存中了。正常開發也能夠放redis 或者 數據庫內
/**
 * @api {post} /user/reg 用戶註冊
 * @apiName 用戶註冊
 * @apiGroup User
 *
 * @apiParam {String} us 用戶名
 * @apiParam {String} ps 用戶密碼
 * @apiParam {String} code 郵箱驗證碼
 *
 * @apiSuccess {String} firstname Firstname of the User.
 * @apiSuccess {String} lastname  Lastname of the User.
 */
router.post('/reg', (req, res) => {
  // 獲取數據
  let { us, ps, code } = req.body // server.js中沒有解析傳參工具的話 會報錯
  if (us && ps && code) {
    // 判斷驗證碼是否ok
    if (!(codes[us] === Number(code))) { // 郵箱做爲用戶名
      return res.send({err: -4, msg: '驗證碼錯誤'})
    }
    User.find({us}).then((data) => {
      if (!data.length) {
        // 用戶名不存在 能夠註冊
        return User.insertMany({ us: us, ps: ps}) // 註冊成功 將數據寫入數據庫
      } else {
        res.send({err: -3, msg: '用戶名已存在'})
      }
    }).then(() => {
      res.send({ err: 0, msg: '註冊成功'})
    }).catch(err => {
      res.send({ err: -2, msg: '註冊失敗'})
    })
  } else {
    return res.send({err: -1, msg: '參數錯誤'})
  }
  // 數據處理
  // 返回數據
  // res.send('test ok')
})
/**
 * @api {post} /user/login 登陸
 * @apiName 登陸
 * @apiGroup User
 *
 * @apiParam {String} us 用戶名
 * @apiParam {String} ps 用戶密碼
 *
 * @apiSuccess {String} firstname Firstname of the User.
 * @apiSuccess {String} lastname  Lastname of the User.
 */
router.post('/login', (req, res) => {
  console.log(req.body)
  let { us, ps } = req.body
  console.log(us, ps)
  if (us && ps) {
    // 
    User.find({ us, ps }).then((data) => {
      if (data.length > 0) {
        res.send({err: 0, msg: '登陸成功'})
      } else {
        res.send({err: -2, msg: '用戶名或者密碼不正確'})
      }
    }).catch(err => {
      // res.send({ err: -2, msg: '註冊失敗'})
      return res.send({err: -1, msg: '內部錯誤'})
    })
  } else {
    return res.send({err: -1, msg: '參數錯誤'})
  }
})

// 發送郵件驗證碼
/**
 * @api {post} /user/login 郵箱驗證碼發送
 * @apiName 郵箱驗證碼發送
 * @apiGroup User
 *
 * @apiParam {String} mail 郵箱
 *
 * @apiSuccess {String} firstname Firstname of the User.
 * @apiSuccess {String} lastname  Lastname of the User.
 */
router.post('/getMailCode', (req, res) => {
  let { mail } = req.body
  if (mail) {
    let code = parseInt( Math.random() * 10000 ) // 隨機驗證碼
    codes[mail] = code
    console.log(codes)
    mailSend.send(mail, code).then(() => {
      res.send({err: 0, msg: '驗證碼發送成功'})
    }).catch((err) => {
      res.send({err: -1, msg: '驗證碼發送失敗'})
    })
  } else {
    res.send({err: -1, msg: '參數錯誤'})
  }
})

module.exports = router

3.效果

啓動本地數據庫
mongod
image.png
啓動服務
node server.js
我使用的是nodemon插件命令,其實就是node命令同樣的,只是能夠在保存代碼的時候 不用重啓服務,能夠直接看效果
image.png
由於咱們沒寫界面,直接經過postman看json

3.1調用驗證碼接口

image.png
image.png

3.2調用註冊接口

先用一個錯誤的驗證碼
image.png
再使用郵箱接收的正確驗證碼
image.png
具體咱們進到本地數據查看數據
image.png
數據錄入成功!api

相關文章
相關標籤/搜索