搭建一個restful風格的我的博客api
restful風格:就是使用同一個接口,經過不一樣的請求方式例如post,get,put,delete等實現數據的增刪查改等web
-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 //項目啓動文件
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 }))
var mongoose = require('mongoose'); var Schema = mongoose.Schema; module.exports = mongoose.model('Category',new Schema({ title:String }))
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 } }))
module.exports = { 'secret':'zp,zp', 'database':'mongodb://127.0.0.1' }
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); //設置訪問路徑