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());
})
nodemon第三命令行工具
npm i --g nodemon
如果是通过nodemon app.js启动服务,会监视文件变化,当文件发生变化时,会自动重启服务器
基本路由 就是一张表 就是具体的映射关系
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的别名
安装
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";
})
})
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-----');
})
//获取表单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-----');
})
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");
})
原生 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;
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;
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(){
}
/**
* 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);
})
}