隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(六)

————————————————————————————————————————————————————————————
-----------------今日份复习nodejs----------------------------
----- Mongoose 介绍
----- 新闻系统的开发
————————————————————————————————————————————————————————————

1.mongoose模块

1.1 mongoose的介绍

Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种边界的封装,是一个基于nodeJS的第三方模块
mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用。

1.2 mongoose的安装

前提要先安装了express框架:

cnpm install mongoose

1.3 mongoose的使用

  • 连接数据库
语法:mongoose.connect("mongodb://服务器:端口号/数据库名",回调函数)
mongoose.connect("mongodb://127.0.0.1:8000",(err) => 
	if(err){
	console.log("数据库连接成功!")
	}
);  后面添加你要连接数据库的地址。
  • 使用mongoose
第一步:先通过express创建一个项目
express -e news_system
第二步:安装依赖
cnpm install
第三步:安装mongoose
cnpm install mongoose

1.4 连接到数据库(项目内演示)

在routes下的index.js文件内,连接至数据库。

var express = require('express');
var router = express.Router();

//引入mongoose模块
var mongoose = require('mongoose');

//连接数据库
mongoose.connect('mongodb://127.0.0.1:27017/admin',{ useNewUrlParser: true,  useUnifiedTopology: true }, (err)=>{
  if(err){
    console.log(err);
  }else{
    console.log("连接数据库成功!");
  }
})

//首页的路由
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});



module.exports = router;

1.5 创建骨架和创建模型(项目内演示)

  • 定义Schema(骨架):
    概述:Schema是一种数据结构的声明,不具备数据库的操作能力。
    骨架类型:String Number Date Buffer ObjectId Array
语法: new mongoose.Schema({
	字段名:类型,
	字段名:类型
})

代码示例:

var singerSchema = new mongoose.Schema({
	name:String,
	age:Number,
	
})
  • 创建模型
    模型:model模型是一种根据骨架创建出来的模型,具备数据库操作的能力,通常用于读取数据库
语法: var singerModel = mongoose.model("模型名称",骨架,"集合名称");  模型名称和集合名称保持一致 

代码示例:

var singerModel = mongoose.model("singer",singerSchema,"singer");
  • 创建实体Entity
    概述:Entity实体是一种根据模型创建出一个实例,具备数据库操作的能力,通常用于写数据(新增,修改,删除)。
语法:var singer = new singerModel();
singer.属性名 = 值;
singer.save();    //将添加到实力上的属性保存到数据库中
singer.remove();  //删除数据
语法:Entity是一种根据模型创建出一个示例,这个示例具备数据库操作的能力,通常用于写数据,包括新增,修改,删除

这个时候我们已经可以在页面上拿到我们数据库的数据了。

var express = require('express');
var router = express.Router();

//引入mongoose模块
var mongoose = require('mongoose');

// 1.连接数据库
mongoose.connect('mongodb://127.0.0.1:27017/admin',{ useNewUrlParser: true,  useUnifiedTopology: true }, (err)=>{
  if(err){
    console.log(err);
  }else{
    console.log("连接数据库成功!");
  }
})

// 2.定义骨架schema
var singerSchema = new mongoose.Schema({
	country:String,
  age:Number,
  name:String
})

//3.创建模型model
var singerModel = mongoose.model("singer",singerSchema,"singer");


//首页的路由
router.get('/', function(req, res, next) {
  //利用模型读取数据
  singerModel.find({},function(err, data){
      res.send(data);
  })
});
module.exports = router;

访问:localhost:2000
在这里插入图片描述

1.6 数据操作(增删改查)

  • 查询数据
模型.find({条件},function(err, data){
	//data是从数据库中读取到的数据,根据条件查询,可以找出多条数据
	//find方法找出来的数据一定是一个数组,及时没有数据也一定是一个空数组
})

查找一条数据:

模型.findById('id',function(err,data){
	//findById找出来的数据是一个对象
})

代码演示:
 //通过id查找数据
  shuguoModel.findById('5e8202a6cb59d6ce903a7dc5',(err, data) => {
      res.send(data);
  })

另外一种常用的写法

  • 新增数据
//新增数据接口
router.get('/add.html',(req, res) => {
    //新增数据
    var sanguo = new sanguoModel();
    sanguo.name = "康家豪";
    sanguo.age = 9;
    //将新增的数据保存到数据库中
    sanguo.save((err) => {
      if(err){
        console.log(err)
      }else{
        res.send("用户新增成功!");
      }
    });
})

注意:如果骨架中没有定义属性及类型,不能加进数据库。

  • 删除数据
    思想:
    第一步:找出要被删除的数据。
    第二步:调用remove()方式删除数据。
//删除数据接口
router.get("/delete.html",(req, res) => {
   //接收GET方式穿的ID值 
   var id = req.query.id;
   //通过ID查找到数据
   sanguoModel.findById(id).exec((err, data) => {
    data.remove((err) => {
      if(err){
        console.log(err);
      }else{
        console.log("删除成功");
      }
    })
 })
   
  • 修改数据
    思想:
    第一步:找出被修改的数据
    第二部:将数据修改以后保存到数据库
    代码实现:
 //修改数据接口
 router.get("/update.html",(req, res) => {
  //接收GET方式穿的ID值 
  var id = req.query.id;
  sanguoModel.findById(id).exec((err, data) => {
    data.name = "曹操";
    data.age = 67;
    data.save((err) => {
      if(err){
        console.log(err)
      }else{
        res.send("修改数据成功!");
      }
    })
  })
})

2.实例需求分析

需求:制作一个基于后端模板的新闻发布系统

功能:
1.允许用户发布新闻
2.允许在首页浏览到全部最新的新闻
3.允许用户操作删除功能
4.允许用户修改新闻

数据库设计
数据库名:news
集合名:list
文档结构:

项目 名称 类型
标题 title String
作者 author String
来源 form String
内容 content String
时间 time String
点击率 hits Number

3.环境搭建

第一步:环境搭建

  • 1.搭建express项目
    + 创建项目 express -e + 项目名称
    + 安装依赖 cnpm install
    + 监听端口 在app.js中监听端口
    + 运行项目 node app
    + 测试项目 打开浏览器

第二步:安装mongoose

  • 配置mongoose
    + 1.连接数据库 mongoose.connect()
    + 2.创建骨架 var Schema = new mongoose.Schema()
    + 3.创建模型 var listModel = mongoose.model()

4.mongoDB CRUD操作 (增删查改操作)

功能实现

1.允许用户发布新闻

  • 制作一个添加新闻的静态页面
  • 制作一个动态页面(save_add.html)用来接收数据,保存到数据库中,提示用户新增成功,跳转
  • 在index.js模块中挂载新的路由,叫做save_add.html 并且提交数据为POST方式。
  • 接收客户端传递过来的所有数据 req.body.参数名
  • 保存到数据库
  • 新增新闻代码示例
//挂载一个保存新增数据的路由
router.post('/save_add.html',(req, res) => {
  //接收客户端传过来的POST方式的数据
  console.log(req.body);
  var title = req.body.title;
  var author = req.body.author;
  var form = req.body.form;
  var content = req.body.content;
  
  // console.log(title, author, form, content);
  //将数据添加到数据库
  var list = new listModel();
  list.title = title;
  list.author = author;
  list.form = form;
  list.content = content;
  list.time = new Date().toLocaleString();
  list.hits = 1;
  //发送到服务器
  list.save((err)=>{
    if(err) {
      console.log("数据库新增失败!")
    }else{
      console.log("数据新增成功!");
    }
  })
})

2.允许在首页浏览到全部最新的新闻

  • 制作一个新闻列表的后端模板
  • 创建一个新的路由list.html
  • 读取数据库中的所有新闻数据
  • listModel.find()
  • 将读取出来的数据与模板结合渲染出结果
  • 浏览新闻代码示例
//创建一个新闻浏览页
router.get('/list.html',(req, res) => {
  //通过listModel获取所有新闻数据
  listModel.find().exec((err, data) => {
    res.render('newslist.ejs',{list:data})
  })
})

3.允许用户操作删除功能

  • 找到删除链接的位置,添加a标签,指向删除功能的路由
  • 删除路由 /delete.html?id="********"
  • 编写一个删除新闻的路由/del.html 接收id值作为被删除数据的标识
  • 根据id找到实体方法,调用remove()方法实现删除数据
  • 删除完成之后跳转到列表页面
  • 代码示例:
//创建一个删除数据的路由
router.get('/delete.html',(req, res) => {
  //接收数据
  var id = req.query.id;

  //通过id查找数据
  listModel.findById(id).exec((err, data)=>{
    //找到对象以后执行删除
    data.remove(() => {
      res.send('<script>alert("删除成功"); location.href="/list.html";</script>');
    });
  })
})

4.允许用户修改新闻

  • 给列表修改后面添加链接,指向到新的地址,也要传id值
  • 值作显示老数据的模板
  • 保存修改后的数据
  • 编写/edit.html实现动态页面
  • 获取id传值,更根据id读取数据
  • 使用ejs模板渲染得到最终结果返回给客户端
  • 代码演示
//创建一个修改数据的路由
router.get('/edit.html',(req, res) => {
  //接收数据
  var id = req.query.id;

  //通过id查找数据
  listModel.findById(id).exec((err, data)=>{
   res.render('newsedit.ejs',{news:data})
  })
})
  • 保存修改数据 创建一个路由叫做save_add.html,用于修改数据,
  • 代码示例:
//创建一个路由/save_edit.html
router.post('/save_edit.html',(req, res) =>{
  //必须获取要被修改的id
  var id = req.body.id;
  
  //接收数据
  var title = req.body.title;
  var author = req.body.author;
  var form = req.body.form;
  var content= req.body.content;

  //修改数据
  listModel.findById(id).exec((err, data) => {
  console.log(req.body);
    data.title = title;
    data.author = author;
    data.form = form;
    data.content = content;
    data.save((err)=>{
      if(err) {
        console.log("数据库新增失败!")
      }else{
        res.send('<script>alert("数据修改成功"); location.href="/list.html";</script>');
      }
    })
    
  })

4.效果展示

新增页:
在这里插入图片描述
浏览新闻页:
在这里插入图片描述
删除页:

修改页:
在这里插入图片描述
全部node后端逻辑代码:

var express = require('express');
var router = express.Router();
//引入mongoose
var mongoose = require("mongoose");


//1.连接数据库
mongoose.connect('mongodb://127.0.0.1:27017/news',{ useNewUrlParser: true,  useUnifiedTopology: true }, (err)=>{
  if(err){
    console.log(err);
  }else{
    console.log("连接数据库成功!");
  }
})

//2.定义骨架
var listSchema = new mongoose.Schema({
  title:String,
  author:String,
  form:String,
  content:String,
  time:String,
  hits:Number
})

//3.创建模型
var listModel = mongoose.model('list',listSchema,'list');




//首页路由
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

//挂载一个保存新增数据的路由
router.post('/save_add.html',(req, res) => {
  //接收客户端传过来的POST方式的数据
  console.log(req.body);
  var title = req.body.title;
  var author = req.body.author;
  var form = req.body.form;
  var content = req.body.content;
  
  // console.log(title, author, form, content);
  //将数据添加到数据库
  var list = new listModel();
  list.title = title;
  list.author = author;
  list.form = form;
  list.content = content;
  list.time = new Date().toLocaleString();
  list.hits = 1;
  //发送到服务器
  list.save((err)=>{
    if(err) {
      console.log("数据库新增失败!")
    }else{
      res.send('<script>alert("数据新增成功"); location.href="/list.html";</script>');
    }
  })
})


//创建一个新闻浏览页
router.get('/list.html',(req, res) => {
  //通过listModel获取所有新闻数据
  listModel.find().exec((err, data) => {
    res.render('newslist.ejs',{list:data})
  })
})

//创建一个删除数据的路由
router.get('/delete.html',(req, res) => {
  //接收数据
  var id = req.query.id;

  //通过id查找数据
  listModel.findById(id).exec((err, data)=>{
    //找到对象以后执行删除
    data.remove(() => {
      res.send('<script>alert("删除成功"); location.href="/list.html";</script>');
    });
  })
})

//创建一个修改数据的路由
router.get('/edit.html',(req, res) => {
  //接收数据
  var id = req.query.id;

  //通过id查找数据
  listModel.findById(id).exec((err, data)=>{
   res.render('newsedit.ejs',{news:data})
  })
})


//创建一个路由/save_edit.html
router.post('/save_edit.html',(req, res) =>{
  //必须获取要被修改的id
  var id = req.body.id;
  
  //接收数据
  var title = req.body.title;
  var author = req.body.author;
  var form = req.body.form;
  var content= req.body.content;

  //修改数据
  listModel.findById(id).exec((err, data) => {
  console.log(req.body);
    data.title = title;
    data.author = author;
    data.form = form;
    data.content = content;
    data.save((err)=>{
      if(err) {
        console.log("数据库新增失败!")
      }else{
        res.send('<script>alert("数据修改成功"); location.href="/list.html";</script>');
      }
    })
    
  })
})

module.exports = router;

有什么问题欢迎大家一起提出建议,我们一起加油!
————————————————————————————————
写在后面
隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(七)
vue+ node项目计划
vue+ node项目技术栈
vue+ node项目规划
vue+ node项目安排
————————————————————————————————

发布了86 篇原创文章 · 获赞 16 · 访问量 6288

猜你喜欢

转载自blog.csdn.net/qq_43955202/article/details/105212082