nodejs+mongodb編寫restful風格博客api

簡介

搭建一個restful風格的我的博客api
restful風格:就是使用同一個接口,經過不一樣的請求方式例如post,get,put,delete等實現數據的增刪查改等web

須要的工具

  • node
  • Postman或者其餘接口測試工具

用到的模塊介紹

  • express : nodejs框架
  • mongoose : 用來方便的和mongodb交互
  • body-parser : 方便咱們從post請求中解析參數
  • morgan : 把請求信息打印在控制檯
  • jsonwebtoken : 用來生成和確認token數據

主要操做流程

  1. 新建一個項目文件夾,使用npm初始化
  2. init -y
  3. 手動輸入依賴環境,或者npm install直接安裝
  • cnpm install --save express mongoose body-parser morgan jsonwebtoken
  • cnpm install
  1. 新建所須要的文件夾以及文件,目錄結構以下
-app/
-----models/                //模塊
----------blog.js
----------category.js
----------user.js
-----routes/                //路由
----------blog.js
----------category.js
----------comment.js
----------setup.js
----------user.js
-node_modules/              //依賴環境安裝後生成
-config.js                  //一些配置
-package.json               //項目依賴環境(初始化後自動生成)
-server.js                  //項目啓動文件

基礎代碼以下

modules/ 模塊文件主要就是導出各類模板供啓動文件server.js調用

user.js user模塊

var mongoose = require('mongoose'); //引入mongoose依賴
var Schema = mongoose.Schema;//mongoose的一切都是以Schema開始的

// 使用modules.exports導出User模塊
module.exports = mongoose.model('User',new Schema({//利用模板的方式啓動模板,並導出
    name:String,
    password:String,
    admin:Boolean
}))

category.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

module.exports = mongoose.model('Category',new Schema({
    title:String
}))

blog.js blog模塊

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

module.exports = mongoose.model('Blog',new Schema({
    title: String,
    body:String,
    antuor:String,
    category:String,
    comment:[{body: String,date:Date}],
    tags:[{title:String}],
    date:{type:Date,default:Date.now},
    hidden:Boolean,
    mete:{
        vores:Number,
        favs:Number
    }
}))

config.js 內容爲各類配置

module.exports = {
    'secret':'zp,zp',    
    'database':'mongodb://127.0.0.1'
}
  • secret的值能夠隨便取,主要是用來生成token時用的
  • 數據庫設置要鏈接數據庫的信息

server.js (這是最基本的啓動文件)

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

var jwt = require('jsonwebtoken');//用來建立和確認用戶信息摘要
var config = require('./config'); //讀取配置文件config.js信息

//一些配置
var port = process.env.PORT || 8080; // 設置啓動端口
mongoose.connect(config.database); // 鏈接數據庫
app.set('superSecret', config.secret); // 設置app 的超級密碼--用來生成摘要的密碼

//用body parser 來解析post和url信息中的參數
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

// 使用 morgan 將請求日誌打印到控制檯
app.use(morgan('dev'));

//路由
//基礎路由
app.get('/',function(req,res){
    res.send("這裏是nodejs+mongodb編寫restfulAPI的筆記!");
})


// 啓動服務
app.listen(port);
console.log('Magic happens at http://localhost:' + port);

先來測試一下,測試以前先開啓mongodb,用postman進行測試
圖片描述mongodb

開始接口編寫

第一個接口 建立管理員

routes/setup.js數據庫

var express = require("express");
var User = require("../modules/user");

var router = express.Router();

router.get('/',function(req,res){

    var admin = new User({
        name:'zhoupeng1',
        password:'12345',
        admin:true
    })      //建立一個管理員

    admin.save(function(err){
        if(err){
            res.json({
                success:false,
                message:'管理員建立失敗'
            });
        }
        res.json({success:true,message:"管理員建立成功"})
        
    })          //加入數據庫,並判斷是否成功
})

module.exports = router; //導出路由

而後server.js中導入路由文件
添加下面兩句:express

var setupRoute = require('./app/routes/setup');// 導入路由文件

app.use('/setup',setupRoute);   //設置訪問路徑

測試
圖片描述npm

第二個接口 管理員登陸

routes/user.jsjson

var express = require('express');
var app = express();//定義app
var User = require("../modules/user")

var jwt = require('jsonwebtoken');//用來建立和確認用戶信息摘要
var config = require('../../config');
app.set('superSecret', config.secret); // 設置app 的超級密碼--用來生成摘要的密碼

var router = express.Router();

router.post('/login',function(req,res){
    User.findOne({
        name:req.body.name //根據用戶輸入用戶名進行匹配
    },function(err,user){   //登陸驗證
        if(err){
            res.json({success:false,message:"登陸失敗"});
        };

        if(!user){
            res.json({success:false,message:"認證失敗,用戶名找不到"});
        }else if(user){
            if(user.password != req.body.password){
                res.json({success:false,message:"認證失敗,密碼錯誤"});
            }else{
                var token = jwt.sign({name:'foo'},app.get('superSecret'));//獲取token
                res.json({
                    success:true,
                    message:"恭喜,登陸成功",
                    token:token
                })
            }
        }
    })
})

而後server.js中導入路由文件
添加下面兩句:api

var userRoute = require('./app/routes/user');// 導入路由文件

app.use('/user',userRoute);   //設置訪問路徑

測試
圖片描述數組

第三個接口 博客分類的增刪查改

routes/category.js

var express = require('express');
var Category = require('../modules/category')
var router = express.Router();

// 添加分類
router.post('/',function(req,res){
    var title = req.body.title;
    console.log(req);
    var category = new Category({
        title:title
    })
    category.save(function(err){
        if(err){
            res.json({
                success:false,
                message:"添加分類成功!"
            })
        }
    })
    res.json({success:true,message:"添加分類成功!"})
})

// 查看全部分類
router.get('/',function(req,res){
    Category.find({},function(err,categories){
        res.json({
            success:true,
            data:categories
        })
    })
})

// 更新分類
router.put('/',function(req,res){

    // 解構賦值
    var {title,newTitle} = req.body;
    Category.findOneAndUpdate({title:title},{title:newTitle},function(err,category){
        if(err){
            res.json({
                success:false,message:"更新分類失敗"
            })
        }
    })
    res.json({success:true,message:"更新分類成功!"})
})

// 刪除分類
router.delete('/',function(req,res){
    console.log('delete category');

    // 解構賦值
    var {title} = req.body;

    Category.remove({title:title},function(err){
        if(err){
            res.json({
                success:false,messge:"刪除分類成功!"
            })
        }
    })
    res.json({success:true,message:"刪除分類成功!"})
})

module.exports = router;

而後server.js中導入路由文件
添加下面兩句:

var categoryRoute = require('./app/routes/category');// 導入路由文件

app.use('/category',categoryRoute);   //設置訪問路徑

測試添加分類,查詢分類

圖片描述

圖片描述

測試更新分類 首先多添加幾條數據,便於查看

圖片描述

圖片描述

圖片描述

測試刪除分類

圖片描述

圖片描述

第四個接口,博客的編寫

routes/blog.js

var express = require("express");
var Blog = require("../modules/blog");

var router = express.Router();


// 顯示全部博客
router.get('/',function(req,res){
    // 根據分類查找
    var {category} = req.query;
    var whereObj = {};
    if(category){
        var reg = new RegExp('^'+category+'$');
        whereObj = {category:reg}
    }
    //var reg = new RegExp('^'+category+'$')與/^category$/的區別
    //前者中的category是拼接上的一個變量,是動態的,
    //後者是靜態的只能匹配'category'這個內容

    Blog.find(whereObj,function(err,blogs){
        res.json({
            success:true,
            data:blogs
        })
    })
})

// 發佈博客
router.post('/',function(req,res){
    // 結構賦值
    var {title,body,author,tags,hidden,category} = req.body;
    console.log(title);
    if(title.length<3){
        res.json({
            success:false,
            message:"標題長度不能小於3"
        })
    }

    // 標籤格式應該是對象數組

    // 把標籤分割成數組格式
    var tagsArray = tags.split(",");
    // 新建一個空數組,用來放對象
    var tagsObjArray = [];
    // 經過遍歷的方式,把標籤內容放入對象裏面,經過push方式
    tagsArray.forEach(function(v){
        tagsObjArray.push({title:v});
    })

    var blog = new Blog({
        title,
        body,
        author,
        tags:tagsObjArray,
        hidden,
        category
    });

   blog.save(function(err){
       if(err){
           res.json({success:false,messafe:"博客發佈失敗"})
       };
       res.json({success:true,message:"博客發佈成功"})
   })
})

// 修改博客
router.put('/',function(){
    var {title,newTitle,body,newBody,author,newAuthor} = req.body;
    if(newTitle.length<3){
        res.json({
            success:false,
            message:"標題長度不能小於3"
        })
    }
    blog.update({
        title:title,
        body:body,
        author:author
    },{
        title:newTitle,
        body:newBody,
        author:newAuthor
    },function(err,blog){
        if(err){
            res.json({
                success:false,
                message:"更新博客失敗"
            })
        }
    });
    res.json({
        success:true,
        message:"更新博客成功"
    })

})

// 刪除博客
router.delete('/',function(req,res){

    // 解構賦值
    var {title} = req.body;

    Blog.remove({
        title:title,
    },function(err){
        if(err){
            res.json({
                success:false,messge:"刪除博客失敗!"
            })
        }
    })
    res.json({success:true,message:"刪除博客成功!"})
})

module.exports = router;

而後server.js中導入路由文件
添加下面兩句:

var blogRoute = require('./app/routes/blog');// 導入路由文件

app.use('/blog',blogRoute);   //設置訪問路徑
相關文章
相關標籤/搜索