开发者学堂课程【Node.js 入门与实战:模块化后代码执行顺序】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/588/detail/8307
模块化后代码执行顺序
基本内容
一、index.is
二、context.js
三、router.js
四、handler.js
五、课堂总结
一、index.js
// 1.加载http模块
var http
=
require( 'http
‘
);
var context
=
require(' ./context.js');
var router
=
require('./router.js );
console.log('1');
//2.创建服务
http. createServer(function(req, res)
{
// count++;//这里的代码每次请求都会执行 。
console.log
('哈哈');
//调用Context.js模块的返回值(函数),并将req和res对象传递给Context.js模块。
context(req, res);
//调用路由模块的返回值(函数),并将req和res 对象传递给router.js 模块。
router(req, res);
}).
listen(
config
.port
, function()
{
console . log
( '
http://localhost:‘config.port');
}
);
二、context.js
//该模块负责对req和res对象进行扩展;
//希望在该模块中做什么:
// 1.为req增加一个query 属性,该属性中保存的就是用户get请求提交过来的数据
// - req. query
//2.为req增加一个pathname属性
// - req .pathname
// 3.为res增加一个render 函数
var url - require('url' ) ;
var fs = require('fs');
var mime = require(‘ mime
’
);
var _ = require( ‘underscore');
console.log('
2
');
//让当前模块对外暴露一个函数,通过这个函数将index.js 中的req和res传递到当前context.js 这个模块中
module .exports - function(req, res) {
var ur
lo
bj . url. parse(req. url. toLowerCase(), true);
//1.为req增加query属性
req.query . ur
lo
bj . query;
//2.为req增加pathname属性
req. pathname . ur
lo
bj. pathname;
// 3.把请求方法req.method 转换为小写
req. method . req . method . toLowerCase();
// 3.为res 增加一个render 函数
res .render . function(filename, tplData) {
fs.readFile(filename, function(err, data) {
if (err) {
res .writeHead(404, 'Not Found', { . Content-Type': . text/html;charset-utf-8' });
res. end( .404, not found.' ) ;
return;
}
//如果用户传递了模板数据,那么就使用 underscore 的 template 方法进行替换
//如果用户没有传递模板数据,那么就不进行替换
if (tplData) {
//如果用户传递了模板数据,表示要进行模板替换
var fn = _. template(data . toString('utf8’));
data = fn(tplData);
}
res . setHeader( ' Content-Type ' , mime . getType(filename)) ;
res .end(data) ;
});
});
});
三、router.js
//加载 handler.js 模块
var handler = require(' . /handler.js');
module .exports . function(req, res) {
//先根据用户请求的路径(路由),将对应的 HTML 页面显示出来
if (req.pathname === '/'|| req.pathname === ‘/index&&req.method === 'get') {
handler. index(req, res);
}else if (req.url === ’/submit' && req . method===‘get') {
handler . submit(req, res);
}else if (req . pathname=== ’/item' && req. method===’get’) {
handler item(req, res);
}else if (req . pathname=== ’/add' && req. method===’get’) {
handler . addGet(req, res);
}else if (req.url === ’/submit' && req . method===‘get') {
handler . addPost(req, res);
}else if (req. url. startsWith(
‘
/resources') &&req . method===m 'get') {
handler . static(req, res);
} else {
handler. handleErrors(req, res);
}
};
四、handler.js
var fs
=
require('fs');
var path
=
require(
‘
path
’
);
var querystring
=
require(
‘
querystring' );
console.log('4');
//处理请求/和/index 的业务方法
module . exports . index
=
function(req, res)
{
// 1.读取 data.json 文件中的数据,并将读取到的数据转换为list数组
readNewsData(function(list)
{
// 2.在服务器端使用模板引擎,将 list 中的数据和 index.html 文件中的内容结合渲染给客户端
res.render(path.join(_
_
dirname,'views',
’
index.html')
,{
list:list
}
);
});
)
;
//处理请求/submit 的业务方法
module . exports .submit
=
function(req, res)
{
//读取submit.html 并返回
res. render(path. join(_
_
dirname, 'views',
’
submit
.
html' ))
;
};
五、课堂总结
l 猜测一下,当启动程序的时候,“1234和哈哈”输出的顺序是怎样的呢?
l 答案是2431。没有“哈哈”。
那么“哈哈”在哪里?是在用户的request的世界里,只有当用户请求的时候才会执行,如果服务启动了以后,只要用户不请求,那么“哈哈”这个程序永远都不执行。只有当用户请求的时候才输出。
l 为什么第一个是2?
答:2在 context.js,当执行node index.js,需要执行index.js源代码,也就是说index.js 里面代码就会从上到下依次执行,先加载这个核心模块紧接着加载context.js。然后contacts.js里面输出2。
l 第二个是4。4在handler.js里面,回到index.js中,一开始执行context.js的时候加载了2,然后紧接着出台执行 router.js,在 router .js 里面是先加载了 hander.js; 在hander.js里面打印出4。
l 下一个是3。hander.js 执行完毕后会打印出来3。
l 最后一个是1。当这些全都加载完毕后,这是代码执行的顺序,当多个模块进行配合执行的时候,需要了解每个模块里面代码是在什么时候执行的。
l 同时请注意一点,“哈哈”每次请求都会执行,但是这几个数字只执行了一次。也就是说这个代码,只有在request世界里面的代码才会每次请求都执行,其余皆代码是都只是在启动的时候只执行一次。
// 1.加载http模块
var http
=
require( 'http
‘
);
var context
=
require(' ./context.js');
var router
=
require('./router.js );
console.log('1');
//var count = 0; //这里的代码只有在第一次启动的时候执行一次。
//2.创建服务
http. createServer
(function(req, res)
{
// count++; //这里的代码每次请求都会执行 。
console.log
('哈哈');
//调用 Context.js 模块的返回值(函数),并将 req 和 res 对象传递给Context.js 模块。
context(req, res);
//调用路由模块的返回值(函数),并将req和res 对象传递给router.js
模块。
router(req, res);
}).
listen(
config
.port
, function()
{
console . log
( '
http://localhost:‘config.port');
}
);