当前位置: 首页 > 后端技术 > Node.js

nodejs+mongodb写restful风格博客api

时间:2023-04-03 15:18:34 Node.js

介绍需要用到的工具和模块主要运行过程介绍基本代码如下modules/模块文件主要是导出启动文件的各种模板server.js调用user.js用户模块category.jsblog.js博客模块config.js内容server.js(这是最基本的启动文件)的一个配置,开始编写界面。第一个界面是创建管理员。第二个界面是管理员登录界面。第三个界面是博客分类的增删改查。第四个界面是编写和创建博客。文件夹介绍搭建restful风格的个人博客apirestful风格:使用同一个接口,通过post、get、put、delete等不同的请求方式,实现数据的增删改查。nodePostman需要的工具或者其他接口测试工具引入的模块express:nodejs框架mongoose:用来方便和mongodb交互body-parser:方便我们解析post请求的参数morgan:在控制台打印请求信息jsonwebtoken:用来生成和确认token数据的主要操作过程新建一个项目文件夹,使用npm初始化init-y手动进入依赖环境,或者npminstall直接安装cnpminstall--saveexpressmongoosebody-parsermorganjsonwebtokencnpminstall新建需要的文件夹和文件,目录结构如下-app/-----models///module------------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用户模块//引入mongoose依赖varSchema=mongoose.Schema;//mongoose中一切以Schema开头//使用modules.exports导出User模块module.exports=mongoose.model('User',newSchema({//使用模板启动模板并导出名称:String,password:String,admin:Boolean}))category.jsvarmongoose=require('mongoose');varSchema=mongoose.Schema;module.exports=mongoose.model('Category',newSchema({title:String}))blog.js博客模块varmongoose=require('mongoose');varSchema=mongoose.Schema;module.exports=mongoose.model('Blog',newSchema({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'}秘密t的值可以随意取,主要用于生成设置token连接数据库信息时使用的数据库server.js(这是最基本的启动文件)varexpress=require('express');varapp=express();varbodyParser=require('body-parser');varmorgan=require('morgan');varmongoose=require('mongoose');varjwt=require('jsonwebtoken');//用于创建和确认用户信息摘要varconfig=require('./config');//读取配置文件config.js信息//一些配置varport=process.env.PORT||8080;//设置启动端口mongoose.connect(config.database);//连接到数据库app.set('superSecret',config.secret);//设置app的超级密码——用于生成摘要的密码//使用body解析器解析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('魔法发生在http://localhost:'+port);先测试一下,测试前启动mongodb,使用postman测试启动界面写第一个界面createadministratorroutes/setup.jsvarexpress=require("express");varUser=require("../modules/user");var路由器=express.Router();router.get('/',function(req,res){varadmin=newUser({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中的路由文件并添加下面两句varsetupRoute=require('./app/routes/setup');//importroutefileapp.use('/setup',设置路线);//设置访问路径测试第二个界面管理员登录routes/user.jsvarexpress=require('express');varapp=express();//定义appvarUser=require("../modules/user")varjwt=require('jsonwebtoken');//用于创建和确认用户信息摘要varconfig=require('../../config');app.set('superSecret',config.secret);//设置应用程序的超级密码——用于生成摘要的密码varrouter=express.Router();router.post('/login',function(req,res){User.findOne({name:req.body.name//根据用户输入用户名Match},function(err,user){//登录验证if(err){res.json({success:false,message:"登录失败"});};if(!user){res.json({success:false,message:"认证失败,未找到用户名"});}elseif(user){if(user.password!=req.body.password){res.json({success:false,message:"认证失败,密码错误"});}else{vartoken=jwt.sign({name:'foo'},app.get('superSecret'));//获取tokenres.json({success:true,message:"恭喜,登录成功",token:token})}}})})然后在server.js中导入路由文件,加入下面两句:varuserRoute=require('./app/routes/user');//导入路由文件app.use('/user',userRoute);//设置访问路径测试第三个接口博客分类的增删改查routes/category.jsvarexpress=require('express');varCategory=require('../modules/category')varrouter=express.Router();//添加类别router.post('/',function(req,res){vartitle=req.body.title;console.log(req);varcategory=newCategory({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('deletecategory');//解构赋值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;then在server.js中导入路由文件,添加下面两句:varcategoryRoute=require('./app/routes/category');//导入路由文件app.use('/category',categoryRoute);//设置访问路径测试添加分类,查询分类测试更新分类首先多加几条数据方便查看测试删除分类第四个接口,写博客routes/blog.jsvarexpress=require("express");varBlog=require("../modules/blog");varrouter=express.Router();//显示所有博客router.get('/',function(req,res){//按类别搜索var{category}=req.query;varwhereObj={};if(category){varreg=newRegExp('^'+category+'$');whereObj={category:reg}}//varreg=newRegExp('^'+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;控制台日志(标题);if(title.length<3){res.json({success:false,message:"标题长度不能小于3"})}//标签格式应该是对象数组//拆分标签转换为数组格式vartagsArray=tags.split(",");//为Put对象创建一个新的空数组vartagsObjArray=[];//通过遍历,将标签内容放入对象中,通过pushtagsArray.forEach(function(v){tagsObjArray.push({title:v});})varblog=newBlog({title,body,author,标签:tagsObjArray,隐藏,类别});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({成功: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中导入路由文件,加入下面两句:varblogRoute=require('./app/routes/blog');//导入路由文件app.use('/blog',blogRoute);//设置访问路径