node使用express增删改查 四

1.文件操作路径

var fs = require('fs');
// 1.文件操作中相对路径可以省略 ./
fs.readFile('data/a.txt',function(err,data){
    if(err){
        console.log("读取失败");
    }
    console.log(data.toString());
})
// 2.但是在模块加载中 相对路径中./不能省略
//require('./data/index.js');
// 3.node中/ 表示根路径
// 在这里代表是去找的c:/data/a.txt
fs.readFile('/data/a.txt',function(err,data){
    if(err){
        console.log("读取失败");
    }
    console.log(data.toString());
})

2.nodemon工具

nodemon第三命令行工具

npm i --g nodemon

如果是通过nodemon app.js启动服务,会监视文件变化,当文件发生变化时,会自动重启服务器

3.static-server静态资源服务

基本路由 就是一张表 就是具体的映射关系

app.ues(’/public/’,express.static(’./public/’))

当以/public/开头的时候,去./public/查找对应的资源

app.ues(express.static(’./public/’))

这样访问的时候就直接访问puablic下的js/a.js,不用加public

app.ues(’/a/’,express.static(’./public/’))

这个可以看做是public别名,访问是localhost:3000/a/js.a.js

可以把a看做public的别名

4.在express配置使用art-template

安装

npm i --save art-template
npm i --save express-art-template

配置

配置使用art-template模板引擎
第一个参数,表示是以.art结尾文件的时候,使用art-template模板引擎
express-art-template是专门表示Express中把art-template 整合到express中
因为express-art-template 依赖了art-template的包
app.engine('art',require('express-art-template'))
express为response响应对象提供了一个方法 render
render方法默认不可以使用,但是如果配置了模板引擎就可以使用了
res.render('html模板名',{模板数据})
第一个参数不用写路径,会自动去views目录中找模板文件
如果想要修改默认的views目录,则可以修改
app.set('views',render函数的默认路径)

使用

app.get('/',function(req,res){
res.render('index.art',{
title:"hello world";
})
})

5.express中重写留言本案例

const express = require('express');
const app = express();
// 静态文件
app.use('/public/',express.static('./public/'));
app.engine('art',require('express-art-template'))
var dataList=[
    {
        name:'雯雯',
        message:'哈哈哈',
        date:'2020/10/13'
    },
    {
        name:'小明',
        message:'哈哈哈',
        date:'2020/10/14'
    },
    {
        name:'小红',
        message:'哈哈哈',
        date:'2020/10/15'
    }
];

app.get('/',function(req,res){
    res.render('index.art',{
        dataList:dataList
    });
})
app.get('/addpage',function(req,res){
    res.render('addpage.art');
})
app.get('/addMeg',function(req,res){
    // 获取提交的参数
    var comment = req.query;
    comment.date = '2017-11-5';
    dataList.unshift(comment);
    // res.statusCode = 302;
    // res.setHeader('Location','/');
    res.redirect('/');
})
app.listen(3000,function(){
    console.log('running-----');
})

6.在express配置解析表单parse

	//获取表单post请求体数据
    // 处理
    // 发送响应
    //在express中没有直接获取post的请求体api,需要使用第三方包 body-parser
    安装
    npm i --save body-parser
    配置
    //引入包
    //当加入这个配置之后,req请求对象就会多出来一个属性 body
    //就可以直接通过req.body来获取post请求体数据
    var bodyParser = require('body-parser')
    配置body-parser中间件 插件 专门用来解析表单
    app.use(bodyParser.urlencoded({extended:false}));
	app.use(bodyParser.json());
    
    res.send和res.redirect会自动res.end()
const express = require('express');
const app = express();
// 静态文件
var bodyParser = require('body-parser');
app.use('/public/',express.static('./public/'));
app.engine('art',require('express-art-template'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
var dataList=[
    {
        name:'雯雯',
        message:'哈哈哈',
        date:'2020/10/13'
    },
    {
        name:'小明',
        message:'哈哈哈',
        date:'2020/10/14'
    },
    {
        name:'小红',
        message:'哈哈哈',
        date:'2020/10/15'
    }
];

app.get('/',function(req,res){
    res.render('index.art',{
        dataList:dataList
    });
})
app.get('/addpage',function(req,res){
    res.render('addpage.art');
})
// app.get('/addMeg',function(req,res){
//     // 获取提交的参数
//     var comment = req.query;
//     comment.date = '2017-11-5';
//     dataList.unshift(comment);
//     // res.statusCode = 302;
//     // res.setHeader('Location','/');
//     res.redirect('/');
// })
//当以post请求post时执行不一样的处理函数
app.post('/addMeg',function(req,res){
//   res.end(JSON.stringify(req.body));
    var commont = req.body;
    commont.date = '2020-12-11';
    dataList.unshift(commont);
    res.redirect('/');
})
app.listen(3000,function(){
    console.log('running-----');
})

7.curd起步

const express = require('express');
const fs = require('fs');
const app= express();
app.engine('html',require('express-art-template'));
app.use('/public/',express.static('./public/'));
app.use('/node_modules/',express.static('./node_modules/'));
app.get('/',function(req,res){
    fs.readFile('./db.json',function(err,data){
        if(err){
            return res.status(500).send('Server error');
        }
        // 原来空格的原因也会导致不行
        // 从文件中读取的数据一定是字符串
        // 所以一定要手动转成对象
        res.render('index.html',{
            user:JSON.parse(data).user
        });
    })
})

app.listen(3000,function(){
    console.log("eunning 3000");
})

8.路由模块的提取

原生 router模块

const fs = require('fs');
module.exports = function (app) {
    //这个是获取到展示学生页面
    app.get('/students', function (req, res) {
        fs.readFile('./db.json', function (err, data) {
            if (err) {
                return res.status(500).send('Server error');
            }
            // 原来空格的原因也会导致不行
            // 从文件中读取的数据一定是字符串
            // 所以一定要手动转成对象
            res.render('index.html', {
                user: JSON.parse(data).user
            });
        })
    })

    // 添加学生的页面
    app.get('/students/new', function (req, res) {

    })
    //提交学生路径
    app.post('/students/new', function (req, res) {

    })

}

app.js里怎么使用呢

var router = require('./router');
router(app);

express提供了更好的一种方式,专门用来包装路由的

const fs = require('fs');
var express = require('express');
//1.创建一个路由容器
// 2.把路由都挂载到路由容器中
var router = express.Router();
//这个是获取到展示学生页面
router.get('/students', function (req, res) {
    fs.readFile('./db.json', function (err, data) {
        if (err) {
            return res.status(500).send('Server error');
        }
        // 原来空格的原因也会导致不行
        // 从文件中读取的数据一定是字符串
        // 所以一定要手动转成对象
        res.render('index.html', {
            user: JSON.parse(data).user
        });
    })
})

// 添加学生的页面
router.get('/students/new', function (req, res) {

})
//提交学生路径
router.post('/students/new', function (req, res) {

})

// 3.把router导出
module.exports = router;

9.处理添加页面以及配置body-parse

const fs = require('fs');
var express = require('express');
//1.创建一个路由容器
// 2.把路由都挂载到路由容器中
var router = express.Router();
//这个是获取到展示学生页面
router.get('/students', function (req, res) {
    fs.readFile('./db.json', function (err, data) {
        if (err) {
            return res.status(500).send('Server error');
        }
        // 原来空格的原因也会导致不行
        // 从文件中读取的数据一定是字符串
        // 所以一定要手动转成对象
        res.render('index.html', {
            user: JSON.parse(data).user
        });
    })
})

// 添加学生的页面
router.get('/students/new', function (req, res) {
    fs.readFile('./views/useradd.html',function(err,data){
        if(err){
            res.statusCode = 500;
        }
        res.render('useradd.html');
    })
})
//提交学生信息路径
router.post('/students/new', function (req, res) {
        var newStudent = req.body;
        // 数据保存在db.json中用以持久化
        // 先读取文件.转化成对象
        // 然后向对象push方法
        // 然后把对象转化成字符串
        // 然后把字符串写入文件
        
})
//根据id编辑学生信息页面路径
router.get('/students/edit', function (req, res) {

})
//编辑学生信息提交路径
router.post('/students/edit', function (req, res) {

})
// 根据id删除学生
router.post('/students/delete', function (req, res) {

})


// 3.把router导出
module.exports = router;

10.强调回调函数

var fs = require('fs');
var express = require('express');
//1.创建一个路由容器
// 2.把路由都挂载到路由容器中
var router = express.Router();
//这个是获取到展示学生页面
var Student = require('./student');
router.get('/students', function (req, res) {
    // fs.readFile('./db.json', function (err, data) {
    //     if (err) {
    //         return res.status(500).send('Server error');
    //     }
    //     // 原来空格的原因也会导致不行
    //     // 从文件中读取的数据一定是字符串
    //     // 所以一定要手动转成对象
    //     res.render('index.html', {
    //         user: JSON.parse(data).user
    //     });
    // })
    Student.find(function(err,data){
        if(err){
            return res.statusCode(500).send('Sever error')
        }
        res.render('index.html', {
            user: data
        });
    })
})

// 添加学生的页面
router.get('/students/new', function (req, res) {
    fs.readFile('./views/useradd.html',function(err,data){
        if(err){
            res.statusCode = 500;
        }
        res.render('useradd.html');
    })
})
//提交学生信息路径
router.post('/students/new', function (req, res) {
        var newStudent = req.body;
        // 数据保存在db.json中用以持久化
        // 先读取文件.转化成对象
        // 然后向对象push方法
        // 然后把对象转化成字符串
        // 然后把字符串写入文件
        

})
//根据id编辑学生信息页面路径
router.get('/students/edit', function (req, res) {

})
//编辑学生信息提交路径
router.post('/students/edit', function (req, res) {

})
// 根据id删除学生
router.post('/students/delete', function (req, res) {

})


// 3.把router导出
module.exports = router;
/**
 * student.js
 * 数据操作 只操作数据,不关心业务
 */
var fs = require('fs');
var dbPath = './db.json';
 /**
  * 获取所有学生列表
  */
exports.find = function(callback){
    fs.readFile(dbPath,'utf-8',function(err,data){
        if(err){
            callback(err);
        }
        callback(null,JSON.parse(data).user);
    })
}
// 回调函数,获取异步结果
// callback中的参数 第一个参数err 第二个参数data
// find(function(err,data){
    
// });

/**
 * 添加到保存学生
 */
exports.save = function(){
    
}

 /**
  * 更新学生
  */
 exports.update = function(){
    
}

 /**
  * 删除学生
  */
 exports.delete = function(){
    
}

11.渲染学生页面,更新内容,删除内容

/**
 * student.js
 * 数据操作 只操作数据,不关心业务
 */
var fs = require('fs');
var dbPath = './db.json';
 /**
  * 获取所有学生列表
  */
exports.find = function(callback){
    fs.readFile(dbPath,'utf-8',function(err,data){
        if(err){
            callback(err);
        }
        callback(null,JSON.parse(data).students);
    })
}
// 回调函数,获取异步结果
// callback中的参数 第一个参数err 第二个参数data
// find(function(err,data){
    
// });

/**
 * 根据id获取学生信息对象
 * @param {*} id
 * @param {*} callback 
 */
exports.findById = function (id,callback) {
    fs.readFile(dbPath,'utf-8',function(err,data){
        if(err){
            callback(err);
        }
        var students = JSON.parse(data).students;
        // 获取查到的id的对象
        var stu =students.find(function (item) {
            return item.id === parseInt(id);
        })
        callback(null,stu);
    })
}

/**
 * 添加到保存学生
 */
exports.save = function(student,callback){
    fs.readFile(dbPath,'utf-8',function(err,data){
        if(err){
            callback(err);
        }
        var students= JSON.parse(data).students;
        // 处理id
        student.id = students[students.length-1].id+1;
        students.push(student);
        var fileData=JSON.stringify({
            students:students
        });
        fs.writeFile(dbPath,fileData,function(err){
            if(err){
                callback(err);
            }
            // 成功就是没错,所以错误对象就是null
            callback(null);
        });
    })
}
// save({
//     name:"lall",
//     age:19,
//     like:"唱歌"
// },function(err){
//     if(err){
//         console.log('保存失败');
//     }
//     console.log("保存成功了");
// })

 /**
  * 更新学生
  */
 exports.updateById = function(student,callback){
    fs.readFile(dbPath,function(err,data) {
        if(err){
         return callback(err)
        }
        // 需要修改谁就需要找到谁
        var students = JSON.parse(data).students;
        student.id = parseInt(student.id);
        // find是es6的一个数组方法,需要接收一个函数作为参数
        // 当某个遍历项符合item ===student.id条件时,find会终止遍历,同时返回item
        var stu=students.find(function (item) {
            return item.id === student.id;
        })
        // 遍历拷贝对象
        for(var key in student){
            stu[key] = student[key];
        }
        //input里输入的都是string,所以需要转换
        // 然后再把数据转化成字符串
        var fileData = JSON.stringify({
            students:students
        })
        // 然后把字符串保存到文件中
        // 注意write和writeFile不一样
        fs.writeFile(dbPath,fileData,function (err) {
            if(err){
                return callback(err);
            }
            callback(null);
        })
    })
}

 /**
  * 删除学生
  */
 exports.deleteById = function(id,callback){
    fs.readFile(dbPath,'utf-8',function(err,data){
        if(err){
            callback(err);
        }
        var students = JSON.parse(data).students;
        // 获取查到的id的对象
        // 亏死了findIndex刚好是返回删除元素的id,就可以用来删除元素
        students.forEach(function(item,index) {
            if(item.id ===parseInt(id)){
                students.splice(item,1);
            }
        });
        // 删除完毕之后就需要将转为字符串
        var fileData = JSON.stringify({
            students:students
        })
        fs.writeFile(dbPath,fileData,function (err) {
            if(err){
                callback(err);
            }
        })
        callback(null);
    })
}

你可能感兴趣的:(node.js,node.js)