02-我的博客筆記-登陸註冊接口的實現

安裝mongodb

參考 http://www.runoob.com/mongodb...
推薦使用 brew 安裝html

安裝完成後運行mongodbnode

配置數據庫,啓動服務端

1.安裝mongoose
使用npm下載模塊時候會發現很慢,因此推薦淘寶的鏡像。git

cnpm i mongoose --save

2.在index.js中鏈接數據庫github

// 加載數據庫模塊
const mongoose = require("mongoose");
mongoose.connect('mongodb://localhost:27017/testblog',function(err){
    if(err){
        console.log('數據庫鏈接失敗');
    }else{
        console.log('數據庫鏈接成功');
        app.listen(4000);
    }
});

這裏的testblog 是咱們建立的數據庫名稱,終端運行node . 或者node index.js 打印數據庫鏈接成功就說明服務已經啓動web

註冊接口實現

1.在寫接口以前還須要安裝一個body-parser插件,body-parser是很是經常使用的一個express中間件,做用是對post請求的請求體進行解析。mongodb

cnpm i body-parser --save

在index.js中引入數據庫

var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

2.在routers下新建user.js,配置路由express

const express = require('express');
const router = express.Router();

router.get('/regiest', function(res, rep) {
    rep.send('Hello, word!');
});

module.exports = router;

在index.js中使用app.use('/user',require('./routers/user'));這種方式加載路由npm

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

//  注意解析要放在上面
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use('/user',require('./routers/user'));

// 加載數據庫模塊
const mongoose = require("mongoose");

mongoose.connect('mongodb://localhost:27017/testblog',function(err){
    if(err){
        console.log('數據庫鏈接失敗');
    }else{
        console.log('數據庫鏈接成功');
        app.listen(4000);
    }
});

從新啓動服務,在瀏覽器中輸入http://localhost:4000/user/regiest,能夠看到打印信息說明路由配置成功。json

3.在schemas文件夾下新建user.js , 用戶相關的Schema

var mongoose = require('mongoose')

module.exports = new mongoose.Schema({
    // 用戶名
    userName: String,
    // 密碼
    passWord: String,
    // 註冊日期
    creatDate: Date,
    token: String
})

4.在models文件夾下新建user.js, 建立用戶相關的模型,數據庫的相關操做都是經過models下面咱們建立的模型來操做的。

var mongoose = require('mongoose')
var userSchema = require('../schemas/user')
module.exports = mongoose.model('User', userSchema)

5.註冊接口

router.post('/regiest', function(req, res, next) {
    var userName = req.body.userName
    var password = req.body.passWord
    var rePassWord = req.body.rePassWord

    if (userName === '') {
        responseData.success = false
        responseData.message = '用戶名不能爲空'
        res.json(responseData)
        return
    }
    if (password === '') {
        responseData.success = false
        responseData.message = '密碼不能爲空'
        res.json(responseData)
        return
    }
    if (password !== rePassWord) {
        responseData.success = false
        responseData.message = '兩次輸入的密碼不一致'
        res.json(responseData)
        return
    }

    User.findOne({
        userName: userName
    }).then((userInfo) => {
        if (userInfo) { // 數據庫中有
            responseData.success = false
            responseData.message = '該用戶已存在'
            res.json(responseData)
            return
        } else {
            // 寫入數據庫
            //獲取hash值  密碼加密
            var hash = bcrypt.hashSync(password, 10)
            //把hash值賦值給password變量
            password = hash

            var user = new User({
                userName: userName,
                passWord: password,
                creatDate: new Date(),
            })
            return user.save()
        }
    }).then((newUserInfo) => {
        responseData.success = true
        responseData.message = '恭喜您,註冊成功'
        responseData.data = {
            userName: newUserInfo.userName,
            userId: newUserInfo._id
        }
        res.json(responseData)
    })
});

其中bcrypt是加密相關的庫

cnpm i bcrypt --save

重啓服務,測試註冊接口。

6.啓動blogclient,咱們如今頁面上放置幾個簡單的文本框來測試登陸接口,關於blogclient的具體網絡配置部分可參考具體的demo

7.登陸接口的要注意的是token的生成規則,依賴框jsonwebtoken和express-jwt

cnpm i jsonwebtoken --save
cnpm i express-jwt  --save
// 登陸
const jwt = require('jsonwebtoken');
router.post('/login', function (req, res, next) {
    var userName = req.body.userName
    var password = req.body.passWord

    User.findOne({
        userName: userName
    }).then((userInfo) => {
        if (userInfo) {
            // 判斷密碼是否正確
            const pwdMatchFlag = bcrypt.compareSync(password, userInfo.passWord);
            if (pwdMatchFlag) {
                responseData.success = true
                responseData.message = '登陸成功'
                responseData.data = {
                    userName: userInfo.userName,
                    userId: userInfo._id,
                    // token 有效期12h(60 * 60 * 12)
                    token: jwt.sign({
                        data: {_id:userInfo._id,username:userInfo.userName},
                        exp: Math.floor(Date.now() / 1000) + (60 * 60 * 12)
                    }, 'jwt-secret')
                }
                res.json(responseData)
                return
            } else {
                responseData.success = false
                responseData.message = '密碼錯誤'
                res.json(responseData)
                return
            }
        } else {
            responseData.success = false
            responseData.message = '該用戶不存在'
            res.json(responseData)
            return
        }
    })
});

在index.js中導入

var jwt = require('express-jwt');

// token相關regiest和login不須要token驗證
var jwt = require('express-jwt');
app.use(jwt({secret: 'jwt-secret', debug: true}).unless({
    path: ['/user/regiest', '/user/login']
}))

demo

demo-02-我的博客筆記-登陸註冊接口的實現

相關庫

express-jwt

jsonwebtoken

bcrypt

body-parser

項目上傳  github 每次提交都是一個分支

線上地址

相關文章
相關標籤/搜索