nodejs的模块化、路由、函数API封装

本文探讨了Node.js的模块化设计,强调模块职能的单一性以提高代码可维护性和开发效率。详细介绍了如何在app.js中创建服务、配置模板引擎、挂载路由以及提供静态资源服务。同时,讲解了router.js路由模块的职责,如何处理不同请求方法和路径的请求处理函数。此外,提到了数据操作文件模块student.js,专注于封装异步API来处理数据。

nodejs的模块化、路由、函数API封装

模块化

模块职能要单一,不要乱写,划分模块的目的就是为了增强项目代码的可维护性,提升开发速率

自己编写的步骤

!](https://img-blog.csdnimg.cn/20201022204031519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MjI4MzMw,size_16,color_FFFFFF,t_70#pic_center)

在这里插入图片描述

app.js入门模块

职责:

  • 1.创建服务
    • 做一些服务相关的配置
    • 模板引擎
    • body-parer解析表单post请求体
    • 提供静态资源服务
  • 2.挂载路由
  • 3.监听端口启动服务
//app.js文件
var express =  require('express');
var bodyParser = require('body-Parser');
//配置body-parser

//加载路由文件模块
var router = require('./router');
var app = express();
app.use('/node_modules/',express.static('./node_modules'));
app.use('/public/',express.static('./public/'));
//配置模板引擎和body-parser一定要在挂载路由之前
app.use(bodyParser.urlencoded( { extended : false }));
app.use(bodyParser.json()); 
app.engine('html',require('express-art-template'));
//挂载路由
app.use(router);
// app.get('/',function(req,res) {
// 	res.send('hello');
// })
app.listen(3000,function() {
	console.log('server is running...');
})

router.js 路由模块

职责:

  • 处理路由
  • 根据不同的请求方法+请求路径设置具体的请求处理函数

路由设计

在这里插入图片描述

路由实现

//router.js文件
var fs = require('fs');
var Student = require('./student.js');
//专门用来包装路由的模块
var express = require('express');

//1.创建一个路由容器
var router = express.Router();
//2.把路由挂载到router路由器中
router.get('/students',function(req,res) {
	
	//渲染学生列表页面
	Student.find(function(err,students) {
		if (err) {
			return res.status(500).send('Server error')
		}
		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) {
	//1.获取表单数据
	// 2.处理
	// 	将数据保存到db.json文件中用以持久化
	// 3.发送请求
	// 先读取出来,转化为对象
	// 然后往对象中push数据
	// 然后把对象转化为字符串
	// 然后把字符串再次写入文件
	Student.save(req.body,function (err) {
		if(err) {
			return res.status(500).send('Server error')
		}
		res.redirect('/students');
	})
})

//渲染编辑页面
 // 1. 在客户端的列表页中处理链接问题(需要有 id 参数)
  // 2. 获取要编辑的学生 id
  // 3. 渲染编辑页面
  //    根据 id 把学生信息查出来
  //    使用模板引擎渲染页面
router.get('/students/edit',function(req,res) {
	Student.findById(parseInt(req.query.id),function(err,student) {
		if(err) {
			return res.status(500).send('Server error');
		}
		res.render('edit.html',{
			student:student
		})
		
	})
})

//处理编辑学生
 // 1. 获取表单数据
  //    req.body
  // 2. 更新
  //    Student.updateById()
  // 3. 发送响应
router.post('/students/edit',function(req,res) {
	Student.updateById(req.body,function(err) {
		if(err) {
			return res.status(500).send('Server error');
		}
		res.redirect('/students');
	})
})

//处理删除学生
  // 1. 获取要删除的 id
  // 2. 根据 id 执行删除操作
  // 3. 根据操作结果发送响应数据

router.get('/students/delete',function(req,res) {
	Student.deleteById(req.query.id,function(err) {
		if (err) {
			return res.status(500).send('Server error');
		}
		res.redirect('/students');
	})
})
//3.把router导出
module.exports = router;

student.js 数据操作文件模块
职责:

  • 操作文件中的数据,只处理数据,不关心业务

这里才是我们学习 Node 的精华部分:奥义之所在
封装异步 API

//student.js文件
var fs = require('fs');
dbPath = './db.json';

exports.find = function (callback) {
	fs.readFile(dbPath,'utf8',function(err,data) {
		if(err) {
			return callback(err);
		}
		callback( null, JSON.parse(data).students);
	})
}

exports.findById = function(id,callback) {
	fs.readFile(dbPath,'utf8',function(err,data) {
		if(err) {
			return callback(err);
		}
		var students = JSON.parse(data).students;
		//遍历数组的方法 find(),返回符合条件的对象
		var ret = students.find(function(item) {
			//将传入的参数转化为整型
			return item.id === parseInt(id);
		})
		callback(null,ret);
	})
}

exports.save = function(student, callback) {
	//第一个参数是对象数据,第二个是回调函数
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}
		//将文件数据转化为对象
		var students = JSON.parse(data).students;

		//处理id唯一,不重复
		//最后的id➕1
		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) {
				return callback(err);
			}
			//成功时错误对象为null
			callback(null);
		})
	}) 
}

exports.updateById = function(student,callback) {
	fs.readFile(dbPath, 'utf8',function(err,data) {
		if(err) {
			return callback(err);
		}
		//获取文件中的数据,并转化为对象
		var students = JSON.parse(data).students;
		//遍历找出id一致的对象,即为需要更新数据的对象
		var stu = students.find(function(item) {
			return item.id = parseInt(student.id);
		})
		//遍历拷贝对象
		for( var key in student) {
			stu[key] = student[key];
		}
		//把对象数据转化为字符串
		var fileData = JSON.stringify({
			students:students
		})
		fs.writeFile(dbPath,fileData,function(err) {
			if(err) {
				// 错误就是把错误对象传递给它
				return callback(err);
			}
			// 成功就没错,所以错误对象是 null
			callback(null)
		})
	});
}

exports.deleteById = function(id,callback) {
	fs.readFile(dbPath,'utf8', function (err,data) {
		if(err) {
			return callback(err);
		}
		var students = JSON.parse(data).students;
		// findIndex 方法专门用来根据条件查找元素的下标
		var deleteId = students.findIndex(function(item) {
			return item.id === parseInt(id);
		})
		// 根据下标从数组中删除对应的学生对象
		students.splice(deleteId,1);
		// 把对象数据转换为字符串
		var fileData = JSON.stringify({
				students:students
		})
		// 把字符串保存到文件中
		fs.writeFile(dbPath,fileData,function(err) {
			if(err) {
				return callback(err);
			}
			callback(null);
		})
	});
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值