搭建一个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); //设置访问路径