node.js(小案例)_使用mongodb对学生信息列表优化
一、前言
1、这篇文章主要对上一篇案列在操作增删改的时候使用mongodb进行优化
2、项目源码(包含上):https://github.com/4561231/crud-express-node.git
3、参考:菜鸟教程,
https://mongoosejs.com/docs/guide.html
二、具体实现
1、关键性js代码
项目入口app.js(基本不变)
//引入express
var express = require('express');
var fs = require('fs');
//引入路由
var router = require('./router') //引入body-parse var bodyParse = require('body-parser') //创建
var app = new express();
//请求访问 //配置开放静态资源
app.use('/public/', express.static('./public/'))
app.use('/node_modules/', express.static('./node_modules/')) //用express来渲染
app.engine('html', require('express-art-template')) //配置body-parse
app.use(bodyParse.urlencoded({ extended: false}));
app.use(bodyParse.json()); //使用router
app.use(router); //设置端口
app.listen(5000, function () { console.log('server is running')
})
app.js
路由router.js
var fs = require('fs');
var express = require('express');
//加入student模块
var Student = require('./student1.js')
//express中转么提供了一种更好的方式可以用来包装路由
var router = express.Router();
//根据路径写好路由壳子
router.get('/students', function (req, res) {
Student.find(function (err, students) {
if(err) {
return res.status(500).send('Server err');
}
res.render('index.html', {
fruits: [
'苹果',
'香蕉',
'橘子'
],
students: students
})
})
});
router.get('/students/new', function (req, res){
res.render('new.html')
});
router.post('/students/new', function (req, res) {
console.log(req.body);
var sudent = new Student(req.body)
sudent.save(function (err) {
if(err) {
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
//这一次通过get到那个编辑页面
router.get('/students/edit', function (req, res) {
//调用得到的是保存之后的数据
//1.如何获取数据
//2.处理数据
//3.发送响应
//4.将数据再次写入data.json文件
console.log(req.query.id);
Student.findById(req.query.id.replace(/"/g,''), function (err, student) {
if (err) {
return res.status(500).send('Server err');
}
//console.log(student);
res.render('edit.html',{
student: student
})
})
});
router.post('/students/edit', function (req, res) {
Student.updateByIdAndUpdate(req.body, function(err){
if (err){
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
router.get('/students/delete', function(req, res) {
Student.findByIdAndRemove(req.query.id.replace(/"/g,''), function (err) {
if(err) {
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
//最后还要导出这个路由
module.exports = router;
router.js
mongodb方式实现数据库操作student1.js
//引入包
var mongoose = require('mongoose'); //连接数据库
mongoose.connect('mongodb://localhost/test'); //建立数据库架构
var Schema = mongoose.Schema; var studentSchema = new Schema({
name: {
type: String,
require: true
}, gender: {
type: Number,
enum: [0,1],
default: 0 }, age: {
type: Number
}
, hobbies: {
type: String
}
})
//导出
module.exports=mongoose.model('Student',studentSchema)
student1.js
2、通过mongodb可以很容易操作数据(不熟悉mongodb可以参考菜鸟教程)
第一步:先安装mongoose这个包,然后搭建数据库如下所示
//引入包
var mongoose = require('mongoose')
//连接数据库
mongoose.connect('mongodb://localhost/itcast', { useMongoClient: true }) var Schema = mongoose.Schema //设置数据库约束
var studentSchema = new Schema({
name: {
type: String,
required: true
},
gender: {
type: Number,
enum: [0, 1],
default: 0
},
age: {
type: Number
},
hobbies: {
type: String
}
}) // 直接导出模型构造函数
module.exports = mongoose.model('Student', studentSchema)
第二步:在router.js中引用
var fs = require('fs');
var express = require('express');
//加入student模块
var Student = require('./student1.js')
//express中转么提供了一种更好的方式可以用来包装路由
var router = express.Router();
//根据路径写好路由壳子
router.get('/students', function (req, res) {
//mongodb中直接用find方法来查找所有信息
Student.find(function (err, students) {
if(err) {
return res.status(500).send('Server err');
}
res.render('index.html', {
fruits: [
'苹果',
'香蕉',
'橘子'
],
students: students
})
})
});
router.get('/students/new', function (req, res){
res.render('new.html')
});
router.post('/students/new', function (req, res) {
console.log(req.body);
//mongodb中用save来保存,添加信息
var sudent = new Student(req.body)
sudent.save(function (err) {
if(err) {
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
//这一次通过get到那个编辑页面
router.get('/students/edit', function (req, res) {
//调用得到的是保存之后的数据
//1.如何获取数据
//2.处理数据
//3.发送响应
//4.将数据再次写入data.json文件
console.log(req.query.id);
//mongodb中直接用findById来查询具体的某条信息
Student.findById(req.query.id.replace(/"/g,''), function (err, student) {
if (err) {
return res.status(500).send('Server err');
}
//console.log(student);
res.render('edit.html',{
student: student
})
})
});
router.post('/students/edit', function (req, res) {
//mongdb中也可以根据如下来更新某一个信息
Student.updateByIdAndUpdate(req.body, function(err){
if (err){
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
router.get('/students/delete', function(req, res) {
//根据id删除具体的对象
Student.findByIdAndRemove(req.query.id.replace(/"/g,''), function (err) {
if(err) {
return res.status(500).send('Server err');
}
res.redirect('/students')
})
});
//最后还要导出这个路由
module.exports = router;
三、总结
node.js(小案例)_使用mongodb对学生信息列表优化的更多相关文章
- node.js(小案例)_实现学生信息增删改
一.前言 本节内容主要对小案例做一个总结: 1.如何开始搭建小项目 2.路由设计 3.模块应用 4.项目源码以及实现过程github地址: 项目演示如下: 二.主要内容 1.项目的关键性js源码: 项 ...
- node.js小案例_留言板
一.前言 通过这个案例复习: 1.node.js中模板引擎的使用 2.node.js中的页面跳转和重定向 二.主要内容 1.案列演示: 2.案列源码:https://github.com/45612 ...
- JS小案例--全选和全不选列表功能的实现
纯js代码实现列表全选和全不选的功能 <!DOCTYPE html> <html> <head lang="en"> <meta char ...
- JS小案例:循环间隔重复变色
在A.B.C三个区块中,有且仅有一个红色,要求红色每隔一秒即进入下一个区块,变色过程不断循环往复. 参考代码: <!DOCTYPE html> <html lang="zh ...
- KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情
KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...
- node.js(node.js+mongoose小案例)_实现简单的注册登录退出
一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...
- Node.js小项目——学生信息管理系统
这是迄今为止第一次接触后端的东西,是一个很小的项目,但是对于前端学习入门很好.我是先学了VUE框架再学的Node,学起来比较轻松,不过每个人都有自己的学习方法️ 一.项目描述 学生信息管理系统,可以实 ...
- Vue.js小案例、生命周期函数及axios的使用
一.调色框小案例: 随着三个滑动框的变化,颜色框的颜色随之改变 1.1.实例代码 <!DOCTYPE html> <html lang="en" xmlns:v- ...
- node.js小工具--修改Xcode 'Create by'作者名称
简介 用Xcode创建源文件时会自动在文件开始位置加入如下注释: // // ISSImageCycleScrollView.m // SoftTravel // // Created by iss1 ...
随机推荐
- 自己实现strchr函数与strstr函数
char* my_strchr(char* str, int i) { if (NULL == str) { return NULL; } while ('\0' != *str && ...
- 鼠标事件-MouseEvent
当鼠标进行某种操作时,就会生成一个event对象,该对象记录着鼠标触发事件时的所有属性. 可以通过如下方法在google控制台打印出 MouseEvent 对象. function mouseDown ...
- Luogu5289 十二省联考2019字符串问题(后缀数组+拓扑排序+线段树/主席树/KDTree)
先考虑80分做法,即满足A串长度均不小于B串,容易发现每个B串对应的所有A串在后缀数组上都是一段连续区间,线段树优化连边然后判环求最长链即可.场上就写了这个. 100分也没有什么本质区别,没有A串长度 ...
- Educational Codeforces Round 60 Div. 2
F:考虑对于每个字母对求出删掉哪些字符集会造成字符串不合法,只要考虑相邻出现的该字母对即可,显然这可以在O(np2)(或小常数O(np3))内求出.然后再对每个字符集判断是否能通过一步删除转移而来即可 ...
- Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot
题意:给出一段操作序列 和目的地 问修改(只可以更改 不可以删除或添加)该序列使得最后到达终点时 所进行的修改代价最小是多少 其中代价的定义是 终点序号-起点序号-1 思路:因为代价是终点序号减去 ...
- Codeforces963C Cutting Rectangle 【数学】
错了一个小地方调了一晚上.... 题目大意: 给出最多2E+5种不同的矩形,每种有它的长h和宽v还有数量d,现在你要构造大矩形,使得在上面沿着平行于长或宽的边划刀,切出来的矩形正好是给出的所有矩形.问 ...
- BZOJ 1497 最大获利
最大权闭合子图 对于这个题,可以抽象成一个图论模型,如果我们把用户与其要求建立的中转站连边,获得的利益看成正权值,付出的代价看成负权值,我们可以发现,选取一个用户的时候,就相当于选取了一个闭合子图. ...
- C/C++ 程序库
C/C++ 程序库 // --------------------------------------------- 来几个不常见但是很变态的库吧: bundle: 把几乎所有常见的压缩库封装成了一个 ...
- vi编辑光标跳到文件开头和结尾以及清空文件命令
vi编辑光标跳到文件开头和结尾以及清空文件命令 按esc退出编辑模式 跳到文件开头: :1 跳到文件结尾: :$ 清空文件内容: 小写的 d 加上大写的 G
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...