开发者学堂课程【Node.js 入门与实战:模块化思路】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/588/detail/8301
模块化思路
目录:
一、模块化思路
二、示例
三、代码模块化
一、模块化思路
让代码模范化:便于代码的使用开发和后期代码的维护
多人协作的条件:代码最好分开几个文件放置,最好每个功能一个文件,每个人负责一个功能修改哪个文件即可。
二、示例
// 1.读取 data.json 文件的数据
readNewsData(function(list)
{
// 2.
// 在把新闻添加到 list 之前,为新闻增加一个id属性url0bj.query.id
=
list.length;
//向数组对象 list 中 push 一条新闻
list.push(url0bj.query);
// 3.写入 data.json 文件
write
N
e
w
sData(JS0N.stringify(list),function()
{
//重定向
res.statusCode
=
302;
res.statusMessage . 'Found';
res.setHeader('Location'
,
'/');
res.end();
}
);
}
);
}
else
i
f (reg.url *** '/add' && req.method ***'post')
{
// 1. 读取 data.json
rea
dNw
sData(function(list)
{
// 2.读取用户 post 提交的数据
postBodyData(req,function(postData)
{
// 3.为用户提交的新闻增加一个 id 属性,并且把新闻对象 push 到list中postData.id
=
list.length;
list.push(postData);
三、代码模块化
1、代码模块一
//1.加载 http 模块
//模块改造的核心思想就是把项目中按照功能模块,不同代码提取到不同JS文件中
//index.js 只负责启动服务,定义为模块一
v
ar
http
=
require('http');
var
fs
=
require('fs');
var
path
=
require('path');
var
mime
=
require('mime');
var url
=
require('url');
var querystring
=
require('querystring');
var_
=
require('underscore');
// 2.代码模块二
2.创建服务
//模块二对 res 和 req 进行扩展服务,为 req 和 res 增加以下更方便好用的 API
http.createServer(function(req,res) {
//要在这里写大量的代码
//为 res 对象添加一个 render() 函数,方便后续使用
//因为现在要渲染的 index.html 中需要用到模板数据,所以给render函数增加了第二个参数
//第二个参数的作用就是用来传递 html 页面中要使用的模板数据
res.render = function(filename,tpLData)//增加一个render函数就是为了后期使用方便,并且渲染时和特定业务无关,其他业务涉及渲染时也可以使用 render 函数.
{
fs.readFile(fllename,
function(err,data) {
i
f (er
r
)
{
res.writeHead(404,'Not Found',{'Content-Type':'text/html;charset
=
utf-8' });
res.end('4B4,not found.');
return;
}
//如果用户传递了模板数据,那么就使用 underscore 的 template 方法进行替换“
//如果用户没有传递模板数据,那么就不进行替换
1f (tplData) {
//如果用户传递了模板数据,表示要进行模板替换
var fn
=
te
m
plate(data.toString('utf8'));
data
=
fn(tp
1
Data);
}
res.setHeader('Content-Type',mime.getType(filename)
)
;
res.end(dat
a)
;
});
3.代码模块三
模块三路由判断
将用户请求的 url 和 method 转换为小写字母 req.url = req.url.toLowerCase();
req.method = req.method.toLowerCase();
通过 url 模块,调用 url.parse() 方法解析用户请求的 url (req.url)
var url0bj = url.parse(req.url,true)
//先根据用户请求的路径(路由),将对应的HTML页面显示出来
if (req.url ·***·
‘
/
’·
req.url·***.
’
/index
’·
&&·req.method·***·
‘
get
’
){
4. 代码模块四
模块四处理具体路由的业务的代码
//1.读取 data.json 文件中的数据,并将读取到的数据转换为list数组
readNewsData(function(list)){
//2.在服务器使用模板引擎,将 list 中的数据和 index.html 文件中的内容结合渲染给客户端
res.render(path.join(_ _dirname,
’
views
’
,
’
index.html
’
),{list:list});
});
} else if(req.url ***
‘
/submit
’
&& req.method ***
‘
get
’
){
//读取 submit.html 并返回
res.render(path.join(_ _dirname,
’
views
’
,
’
submit.html
’
));
}
else if (url0bj.pathname ===
‘
/item
’
&& req.method ===
‘
get
’
){
//1.获取当前用户请求的新闻的 id
//url0bj.query.id
//2.读取 data.json 文件中的数据,根据 id 找到对应新闻
}
}