————————————————————————————————————————————————————————————
-----------------今日份复习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项目安排
————————————————————————————————