所有文章 > API开发 > nodejs + mongodb 编写 restful 风格博客 api

nodejs + mongodb 编写 restful 风格博客 api

简介

搭建一个restful风格的个人博客apirestful风格:就是使用同一个接口,通过不同的请求方式例如post,get,put,delete等实现数据的增删查改等。

需要的工具

  • node
  • Postman或者其他接口测试工具

用到的模块介绍

  • express : nodejs框架
  • mongoose : 用来方便的和mongodb交互
  • body-parser : 方便我们从post请求中解析参数
  • morgan : 把请求信息打印在控制台
  • jsonwebtoken : 用来生成和确认token数据

主要操作流程

1.新建一个项目文件夹,使用npm初始化

  1. npm init -y

2.手动输入依赖环境,或者npm install直接安装

  1. cnpm install --save express mongoose body-parser morgan jsonwebtoken
  2. cnpm install

3.新建所需要的文件夹以及文件,目录结构如下

  1. app/
  2. -----models/                //模块
  3. ----------blog.js
  4. ----------category.js
  5. ----------user.js
  6. -----routes/                //路由
  7. ----------blog.js
  8. ----------category.js
  9. ----------comment.js
  10. ----------setup.js
  11. ----------user.js
  12. -node_modules/              //依赖环境安装后生成
  13. -config.js                  //一些配置
  14. -package.json               //项目依赖环境(初始化后自动生成)
  15. -server.js                  //项目启动文件

基础代码如下

modules/ 模块文件

主要就是导出各种模板供启动文件server.js调用

user.js user模块

  1. var mongoose = require('mongoose'); //引入mongoose依赖
  2. var Schema = mongoose.Schema;//mongoose的一切都是以Schema开始的
  3. // 使用modules.exports导出User模块
  4. module.exports = mongoose.model('User',new Schema({//利用模板的方式启动模板,并导出
  5.    name:String,
  6.    password:String,
  7.    admin:Boolean
  8. }))

category.js

  1. var mongoose = require('mongoose');
  2. var Schema = mongoose.Schema;
  3. module.exports = mongoose.model('Category',new Schema({
  4.    title:String
  5. }))

blog.js blog 模块

  1. var mongoose = require('mongoose');
  2. var Schema = mongoose.Schema;
  3. module.exports = mongoose.model('Blog',new Schema({
  4.    title: String,
  5.    body:String,
  6.    antuor:String,
  7.    category:String,
  8.    comment:[{body: String,date:Date}],
  9.    tags:[{title:String}],
  10.    date:{type:Date,default:Date.now},
  11.    hidden:Boolean,
  12.    mete:{
  13.        vores:Number,
  14.        favs:Number
  15.    }
  16. }))

config.js

内容为各种配置

  1. module.exports = {
  2.    'secret':'zp,zp',    
  3.    'database':'mongodb://127.0.0.1'
  4. }

说明:

  • secret的值可以随便取,主要是用来生成token时用的
  • 数据库设置要连接数据库的信息
server.js

这是最基本的启动文件

  1. var express = require('express');
  2. var app = express();
  3. var bodyParser = require('body-parser');
  4. var morgan = require('morgan');
  5. var mongoose = require('mongoose');
  6. var jwt = require('jsonwebtoken');//用来创建和确认用户信息摘要
  7. var config = require('./config'); //读取配置文件config.js信息
  8. //一些配置
  9. var port = process.env.PORT || 8080; // 设置启动端口
  10. mongoose.connect(config.database); // 连接数据库
  11. app.set('superSecret', config.secret); // 设置app 的超级密码--用来生成摘要的密码
  12. //用body parser 来解析post和url信息中的参数
  13. app.use(bodyParser.urlencoded({extended: false}));
  14. app.use(bodyParser.json());
  15. // 使用 morgan 将请求日志打印到控制台
  16. app.use(morgan('dev'));
  17. //路由
  18. //基础路由
  19. app.get('/',function(req,res){
  20.    res.send("这里是nodejs+mongodb编写restfulAPI的笔记!");
  21. })
  22. // 启动服务
  23. app.listen(port);
  24. console.log('Magic happens at http://localhost:' + port);

先来测试一下,测试之前先开启mongodb,用postman进行测试:

开始接口编写

第一个接口 创建管理员

routes/setup.js

  1. var express = require("express");
  2. var User = require("../modules/user");
  3. var router = express.Router();
  4. router.get('/',function(req,res){
  5.    var admin = new User({
  6.        name:'zhoupeng1',
  7.        password:'12345',
  8.        admin:true
  9.    })      //创建一个管理员
  10.    admin.save(function(err){
  11.        if(err){
  12.            res.json({
  13.                success:false,
  14.                message:'管理员创建失败'
  15.            });
  16.        }
  17.        res.json({success:true,message:"管理员创建成功"})
  18.    })          //加入数据库,并判断是否成功
  19. })
  20. module.exports = router; //导出路由

然后server.js中导入路由文件,添加下面两句:

  1. var setupRoute = require('./app/routes/setup');// 导入路由文件
  2. app.use('/setup',setupRoute);   //设置访问路径

测试:

第二个接口 管理员登录

routes/user.js

  1. var express = require('express');
  2. var app = express();//定义app
  3. var User = require("../modules/user")
  4. var jwt = require('jsonwebtoken');//用来创建和确认用户信息摘要
  5. var config = require('../../config');
  6. app.set('superSecret', config.secret); // 设置app 的超级密码--用来生成摘要的密码
  7. var router = express.Router();
  8. router.post('/login',function(req,res){
  9.    User.findOne({
  10.        name:req.body.name //根据用户输入用户名进行匹配
  11.    },function(err,user){   //登录验证
  12.        if(err){
  13.            res.json({success:false,message:"登录失败"});
  14.        };
  15.        if(!user){
  16.            res.json({success:false,message:"认证失败,用户名找不到"});
  17.        }else if(user){
  18.            if(user.password != req.body.password){
  19.                res.json({success:false,message:"认证失败,密码错误"});
  20.            }else{
  21.                var token = jwt.sign({name:'foo'},app.get('superSecret'));//获取token
  22.                res.json({
  23.                    success:true,
  24.                    message:"恭喜,登录成功",
  25.                    token:token
  26.                })
  27.            }
  28.        }
  29.    })
  30. })

然后server.js中导入路由文件,添加下面两句:

  1. var userRoute = require('./app/routes/user');// 导入路由文件
  2. app.use('/user',userRoute);   //设置访问路径

测试:

第三个接口 博客分类的增删查改

routes/category.js

  1. var express = require('express');
  2. var Category = require('../modules/category')
  3. var router = express.Router();
  4. // 添加分类
  5. router.post('/',function(req,res){
  6.    var title = req.body.title;
  7.    console.log(req);
  8.    var category = new Category({
  9.        title:title
  10.    })
  11.    category.save(function(err){
  12.        if(err){
  13.            res.json({
  14.                success:false,
  15.                message:"添加分类成功!"
  16.            })
  17.        }
  18.    })
  19.    res.json({success:true,message:"添加分类成功!"})
  20. })
  21. // 查看所有分类
  22. router.get('/',function(req,res){
  23.    Category.find({},function(err,categories){
  24.        res.json({
  25.            success:true,
  26.            data:categories
  27.        })
  28.    })
  29. })
  30. // 更新分类
  31. router.put('/',function(req,res){
  32.    // 解构赋值
  33.    var {title,newTitle} = req.body;
  34.    Category.findOneAndUpdate({title:title},{title:newTitle},function(err,category){
  35.        if(err){
  36.            res.json({
  37.                success:false,message:"更新分类失败"
  38.            })
  39.        }
  40.    })
  41.    res.json({success:true,message:"更新分类成功!"})
  42. })
  43. // 删除分类
  44. router.delete('/',function(req,res){
  45.    console.log('delete category');
  46.    // 解构赋值
  47.    var {title} = req.body;
  48.    Category.remove({title:title},function(err){
  49.        if(err){
  50.            res.json({
  51.                success:false,messge:"删除分类成功!"
  52.            })
  53.        }
  54.    })
  55.    res.json({success:true,message:"删除分类成功!"})
  56. })
  57. module.exports = router;

然后server.js中导入路由文件,添加下面两句:

  1. var categoryRoute = require('./app/routes/category');// 导入路由文件
  2. app.use('/category',categoryRoute);   //设置访问路径

测试添加分类,查询分类:

测试更新分类 首先多添加几条数据,便于查看:

测试删除分类: 

第四个接口,博客的编写

routes/blog.js

  1. var express = require("express");
  2. var Blog = require("../modules/blog");
  3. var router = express.Router();
  4. // 显示所有博客
  5. router.get('/',function(req,res){
  6.    // 根据分类查找
  7.    var {category} = req.query;
  8.    var whereObj = {};
  9.    if(category){
  10.        var reg = new RegExp('^'+category+'$');
  11.        whereObj = {category:reg}
  12.    }
  13.    //var reg = new RegExp('^'+category+'$')与/^category$/的区别
  14.    //前者中的category是拼接上的一个变量,是动态的,
  15.    //后者是静态的只能匹配'category'这个内容
  16.    Blog.find(whereObj,function(err,blogs){
  17.        res.json({
  18.            success:true,
  19.            data:blogs
  20.        })
  21.    })
  22. })
  23. // 发布博客
  24. router.post('/',function(req,res){
  25.    // 结构赋值
  26.    var {title,body,author,tags,hidden,category} = req.body;
  27.    console.log(title);
  28.    if(title.length<3){
  29.        res.json({
  30.            success:false,
  31.            message:"标题长度不能小于3"
  32.        })
  33.    }
  34.    // 标签格式应该是对象数组
  35.    // 把标签分割成数组格式
  36.    var tagsArray = tags.split(",");
  37.    // 新建一个空数组,用来放对象
  38.    var tagsObjArray = [];
  39.    // 通过遍历的方式,把标签内容放入对象里面,通过push方式
  40.    tagsArray.forEach(function(v){
  41.        tagsObjArray.push({title:v});
  42.    })
  43.    var blog = new Blog({
  44.        title,
  45.        body,
  46.        author,
  47.        tags:tagsObjArray,
  48.        hidden,
  49.        category
  50.    });
  51.   blog.save(function(err){
  52.       if(err){
  53.           res.json({success:false,messafe:"博客发布失败"})
  54.       };
  55.       res.json({success:true,message:"博客发布成功"})
  56.   })
  57. })
  58. // 修改博客
  59. router.put('/',function(){
  60.    var {title,newTitle,body,newBody,author,newAuthor} = req.body;
  61.    if(newTitle.length<3){
  62.        res.json({
  63.            success:false,
  64.            message:"标题长度不能小于3"
  65.        })
  66.    }
  67.    blog.update({
  68.        title:title,
  69.        body:body,
  70.        author:author
  71.    },{
  72.        title:newTitle,
  73.        body:newBody,
  74.        author:newAuthor
  75.    },function(err,blog){
  76.        if(err){
  77.            res.json({
  78.                success:false,
  79.                message:"更新博客失败"
  80.            })
  81.        }
  82.    });
  83.    res.json({
  84.        success:true,
  85.        message:"更新博客成功"
  86.    })
  87. })
  88. // 删除博客
  89. router.delete('/',function(req,res){
  90.    // 解构赋值
  91.    var {title} = req.body;
  92.    Blog.remove({
  93.        title:title,
  94.    },function(err){
  95.        if(err){
  96.            res.json({
  97.                success:false,messge:"删除博客失败!"
  98.            })
  99.        }
  100.    })
  101.    res.json({success:true,message:"删除博客成功!"})
  102. })
  103. module.exports = router;

然后server.js中导入路由文件,添加下面两句:

  1. var blogRoute = require('./app/routes/blog');// 导入路由文件
  2. app.use('/blog',blogRoute);   //设置访问路径

本文章转载微信公众号@SegmentFault思否

#你可能也喜欢这些API文章!