开发者学堂课程【Node.js 入门与实战:提取handler.js模块(handler.index方法封装)】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/588/detail/8305
提取handler.js模块(handler.index方法封装)
基本内容
一、 handler.js模块所要思考的问题
二、 对外暴露的函数
一、 handler.js 模块所要思考的问题
// 该模块负责对具体的业务进行处理
l //步骤:
//1、思考: 该模块中要分装什么代码?
//2、思考: 这些代码中有用到外部的数据吗? 如果用到了是否需要通过参数将这些数据传递到当前模块中。
//3、 当前模块对外需要暴露的东西。(module.exports的值)
//加载handler.js模块
var
handler
=
require(
‘./handler.js’);
//处理请求/和/index 的业务方法
// 1.读取data.json 文件中的数据,并将读取到的数据转换为list数组
readNewsData(function(list) {
// 2.在服务器端使用模板引擎,将list 中的数据和index.html 文件中的内容结合渲染给客户端 res.render(path.join(__dirname,'views',’index.html'),{list:list});
});
//处理请求/submit 的业务方法
//读取 submit.html 并返回
res. render(path. join(__dirname, 'views', ’submit.html' ));
};
// 1.获取当前用户请求的新闻的id
// ur10bj .query.id
// 2.读取data.json 文件中的数据,根据id找到对应新闻
readNewsData(function(list news) {
var model = null;
//循环 list_ news 中的数据,找到和idT值相等的数据
for (var i = 0; i < list news .length; i++) {
//判断集合中是否有与用户提交的id相等的新闻
if (list news[i]. id. toString() --- req .query.id) {
//如果找到了相等的新闻,则将其记录下来
model = list news[i];
break;
}
}
if (model) {
// 3.调用 res.render() 函数进行模板引擎的渲染
res. render(path. join(__ dirname, 'views' ,' details.html'), { item: model });
}
else
{
res.end('No Such Item' );
}
}
);
l 回答:
1、 思考一下这些方法中有用到外部数据吗?
答:肯定是会用到response和request是我,response和request在业务处理里是肯定会用到的,因为只有通过request才能拿到用户提交过来的数据,只有通过response才能让用户响应。在第一个该模块中封装的就是上述一段一段的代码。
2、 思考这些代码中用到了外部的数据吗?
答:用到了这个response或者request。
是否需要通过参数将这些数据传递到当前模块中?
答:既然用到了外部数据,肯定是要通过参数传递进来。
3、 第三个思考当前模块module.experts应该对外暴露什么?
答:之前对外暴露都是函数。
为什么对外暴露都是一个函数?
答:因为在之前的模块中一个函数的代码都写到一个函数里面了了,contexts也把代码都写到这个函数里面了,但是现在却不一样?现在是要把这代码提交几个不同的方法里面;当用户请求/index的时候需要调一个函数,这个函数要处理/index封装的业务代码,当用户请求/submit的时候,需要封装/submit这段代码;当用户请求/item的时候要封装对应的item代码。
根据不同的请求要执行不同的方法中的代码,所以这个业务模块对外暴露的不能是一个函数,如果是一个函数,只能证明每次请求不同路由执行的都是同样代码。
所以说业务方法需要对外暴露的就是不同的函数,并且不同函数来处理不同的业务。那么module.experts对外暴露不是一个函数.
l 任何一个模块默认 module.experts 都默认等于一个对象
mo
dule.expert
s
= { } ;
现在要为这个空对象上加很多不同的方法,每一个不同的方法处理一个对应的一个路由请求。接下来第三步,确定当前模块对暴露的experts是一个对象,并且这个对象上画了不同的方法。为什么是一个对象,因为要返回N多个方法,不是一个方法,所以要用一个对象把这些程序组织起来,另外每一个方法中都要用到request和response,所以说在每个业务中都要把request和response传进来。
二、 对外暴露的函数
1、第一个对外暴露的函数:函数model.experts,第一个指标处理用户请求index求这个业务,假设这个方法,并且发现这个方法是用户get请求Index或者get路径,直接给experts的index的方法,是被对象加了index的方法,这个方法中有两个参数,Request和response。
2、正确的handle.js模块
mo
dule.expert
s
= { } ;
var fs = require('fs');
var path = require( ‘path’ );
var querystring = require(‘querystring' );
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 });
});
//封装一个读取data.json文件的函数
function readNewsData(callback) {
fs.readFile(path. join(_ dirname, ‘data' , ‘data.json'), 'utf8', function(err, data) {
if (err && err.code
|
== 'ENOENT') {
throw err;
}
var list . JSON.parse(data || ' [ ]');
//通过调用回调函数callback() 将读取到的数据list. 传递出去
callback(list);
}
);
}
// 封装一个写入data.json文件的函数
function writeNewsData(data, callback) {
fs.writeFile(path. join(__ dirname, ‘data' , ‘data.json'),data,function(err, data) {
if (err) {
throw err;
}
//调用callback()来执行当写入数据完毕后的操作
c
allback
();
});
}
// 分装一个获取用户post提交的数据的方法
function postBodyData(req, caLlback) {
var. array [];
req.on(' data’ ,function(chunk) {
array.push(chunk);
}
);
// 监听request对象的end事件
//当end事件被触发的时候,表示所有数据都已经提交完毕了
req.on(‘end', function() {
var postBody Buffer. concat(array);
// 把获取到的buffer对象转换为一个字符串
postBody=postBody.toString('utf8‘);
// 把post请求的查询字符串转换为一个json对象
postBody = querystring.panse(postBody);
// 把用户提交过来的数据传递出去
callback(postBody);
}
);
}
当用户请求/index时,使用业务模块中handler模块来处理,
测试一下新闻列表页首页是否正常,重新启动9090,访问一下首页。