Node JS 05 - CRUD
Path 模块
-
将路径解析为一个对象 :
path.parse('c:/b/c/index.html')
{root:'C:/',dir:'C:/b/c',base:'index.html',ext:'.html',name:'index'}
-
拼接字符串 :
path.join('c:/','b')
自动拼接路径,和分隔符,需要路径拼接的时候使用
Node 中的其他成员
在每个模块中,除了 require , exports 等模块相关 API 之外, 还有来年各个特殊的成员
- __dirname 可以用来动态获取当前文件模块所属目录的绝对路径
- __filename 可以用来动态获取当前文件的绝对路径
在文件操作中, 使用相对路径是不可靠的,因为在 Node 中文件操作的路径被设计为相对于执行 node 命令所处的路径.
为了解决这个问题 ,只需要将相对路径变为绝对路径就可以了.
也就是说可以使用 __filedir`` __fileName
帮我们解决问题
CRUD
步骤 :
-
生成 package.json
npm init
-
环境准备
- db.json
{ "students": [ { "id": 2, "name": "lisi", "gender": 1, "hobbies": "打篮球,LOL" }, { "id": 3, "name": "lisi", "gender": 1, "hobbies": "打篮球,LOL" } ] }
-
编写 main.js 文件
- 创建服务
var express = require('express')
- 安装 art -template :
npm install --save art-template npm install --save express-art-template
- 配置 art-template :
app.engine('art',require('express-art-template'))
- 安装 body-parser :
// 安装 : npm install --save body-parser
- 配置 body-parser :
var bodyParser = require('body-parser') app.use(bodyParser.urlencoded({extended:false})) app.use(bodyParser.json())
- 配置静态资源 :
app.use('/public/',express.static('./public/')) app.use('/node_modules/',express.static('./node_modules/'))
- 挂载路由 :
var router = require('./router') app.use(router)
- 监听端口 :
app.listen(3000,function(){ console.log('server started ...') })
- 创建服务
/*
主模块 :
1. 创建服务
2. 做一些服务的相关配置
2-1. 配置模板引擎
2-2. 配置 body-parser
2-3. 提供静态资源服务
3. 挂载路由
4. 监听端口
*/
var express = require('express')
var fs = require('fs')
var router = require('./router')
var bodyParser = require('body-parser')
var app = express()
// 配置模板引擎
app.engine('html',require('express-art-template'))
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
app.use(router)
// 配置静态资源
app.use('/public/',express.static('./public/'))
app.use('/node_modules/',express.static('./node_modules/'))
// 监听端口号
app.listen(3000,function(){
console.log('server started ...')
})
module.exports = app
- 编写 router.js
/*
路由模块 :
只用来进行路由的配置
*/
var express = require('express')
var router = express.Router()
var fs = require('fs')
var student = require('./student')
router.get('/student',function(req,res){
student.find(function(err,data){
if(err){
res.status(500).send('Server Error...')
}
//console.log(data)
res.render('index.html',{
students:data
})
})
})
router.get('/',function(req,res){
student.find(function(err,data){
if(err){
res.status(500).send('Server Error...')
}
//console.log(data)
res.render('index.html',{
students:data
})
})
})
router.get('/student/add',function(req,res){
res.render('add.html')
})
router.post('/student/add',function(req,res){
var studentBody = req.body
//console.log(studentBody)
student.add(studentBody,function(err){
if(err){
res.status(500).send('Server Error...')
}
res.redirect('/student')
})
})
router.get('/student/edit',function(req,res){
var query = req.query
student.findById(query.id,function(err,data){
if(err){
res.status(500).send('Server Error...')
}
res.render('edit.html',{
student:data
})
})
})
router.post('/student/edit',function(req,res){
var body = req.body
//console.log(body)
student.edit(body,function(err){
if(err){
res.status(500).send('Server Error...')
}
res.redirect('/student')
})
})
router.get('/student/delete',function(req,res){
student.deleteById(req.query.id,function(err){
if(err){
res.status(500).send('Server Error...')
}
res.redirect('/student')
})
})
module.exports = router
- 编写 student.js
/*
学生操作模块
职责 : 对学生进行增删改查
*/
var fs = require('fs')
var dbPath = './db.json'
/*
* 获取学生列表
*/
exports.find = function (callback) {
fs.readFile(dbPath,function(err,data){
if(err){
return callback(err)
}
//console.log(JSON.parse(data.toString()).students)
callback(null,JSON.parse(data.toString()).students)
})
}
/*
根据 id 查询学生信息
*/
exports.findById = function(id,callback){
// 获取 db 数据
fs.readFile('./db.json','utf8',function(err,data){
if(err){
return callback(err)
}
// 格式化为JSON对象
var students = JSON.parse(data).students
// 查询出指定 id 的对象
var student = students.find(function(item){
// 将 id 转为 number 类型
return item.id === parseInt(id)
})
// 返回
callback(null,student)
})
}
/*
添加学生
*/
exports.add = function(student,callback){
// 读取数据文件
fs.readFile('./db.json','utf8',function(err,data){
if(err){
return callback(err)
}
// 将读取到的数据转为数组
var students = JSON.parse(data).students
// 获取最后一个id并加一
var id = students[students.length-1].id+1
// 设置到传入的 student 中
student.id=id
// 将 student push 到 数组中
students.push(student)
// 将数组保存到数据文件中
var studentsData = JSON.stringify({
students:students
})
fs.writeFile('./db.json',studentsData,function(err){
if(err){
return callback(err)
}
return callback(null)
})
})
}
/*
修改学生
*/
exports.edit = function(student,callback){
// 读取文件内容
fs.readFile('./db.json','utf8',function(err,data){
if(err){
return callback(err)
}
// 将内容转为 JSON 数据
var students = JSON.parse(data).students
student.id = parseInt(student.id)
// 找到要修改的学生信息
var modifyStu = students.find(function(item){
return item.id === student.id
})
//console.log('要修改的学生信息为:'+modifyStu)
// 进行修改 遍历属性进行修改
for(var key in student){
modifyStu[key] = student[key]
}
//console.log('修改后的学生信息为 :'+modifyStu)
// 将修改后的 JSON 转为字符串
var studentsData = JSON.stringify({
students:students
})
//console.log('修改后的学生字符串信息为 :'+modifyStu)
// 写回文件中
fs.writeFile('./db.json',studentsData,function(err){
if(err){
return callback(err)
}
return callback(null)
})
})
}
/*
删除学生
*/
exports.deleteById = function(id,callback){
// 读取文件内容
fs.readFile(dbPath,function(err,data){
if(err){
return callback(err)
}
// 转为 JSON 对象
var students = JSON.parse(data).students
//遍历 students 找到指定 id 的下标
var index = students.findIndex(function(item){
return item.id === parseInt(id)
})
//删除指定 index 的对象
students.splice(index,1)
// 将 JSON 对象转为字符串
var studentsData = JSON.stringify({
students:students
})
// 写回文件中
fs.writeFile('./db.json',studentsData,function(err){
if(err){
return callback(err)
}
return callback(null)
})
})
}
find 与 findIndex 原理
var users = [
{id:1,name:'zhangsan'},
{id:2,name:'zhangsan'},
{id:3,name:'zhangsan'}
]
Array.prototype.myFind = function(conditionFunc){
for (var i = 0; i < this.length; i++){
if(conditionFunc(this[i],i)){
//findIndex
//return i;
//find
return this[i]
}
}
}
var ret = users.myFind(function(item,index)){
return item.id === 2
}
console.log(ret)