nodejs + mongodb 编写 restful 风格博客 api

Posted SegmentFault

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs + mongodb 编写 restful 风格博客 api相关的知识,希望对你有一定的参考价值。

简介

搭建一个restful风格的个人博客api。restful风格:就是使用同一个接口,通过不同的请求方式例如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);   //设置访问路径

测试:

nodejs + mongodb 编写 restful 风格博客 api

第二个接口 管理员登录

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

测试:

nodejs + mongodb 编写 restful 风格博客 api

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

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

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

nodejs + mongodb 编写 restful 风格博客 api

nodejs + mongodb 编写 restful 风格博客 api

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

nodejs + mongodb 编写 restful 风格博客 api

nodejs + mongodb 编写 restful 风格博客 api

nodejs + mongodb 编写 restful 风格博客 api

测试删除分类: 

nodejs + mongodb 编写 restful 风格博客 api

第四个接口,博客的编写

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


相关文章推荐







以上是关于nodejs + mongodb 编写 restful 风格博客 api的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 和 MongoDB 单元测试

nodejs-7. mongoDB数据库

nodejs下值mangoDB

NodeJS学习笔记之MongoDB模块

为啥在 NodeJs 开发中 Mongodb 比 MySql 更受欢迎? [关闭]

使用 NodeJs 的 Mongodb 地理空间查询(Haversine 公式)