提取 handler.js 模块(handler.index 方法封装)|学习笔记

简介: 快速学习提取 handler.js 模块(handler.index 方法封装)

开发者学堂课程【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 都默认等于一个对象

module.experts = { } ;

现在要为这个空对象上加很多不同的方法,每一个不同的方法处理一个对应的一个路由请求。接下来第三步,确定当前模块对暴露的experts是一个对象,并且这个对象上画了不同的方法。为什么是一个对象,因为要返回N多个方法,不是一个方法,所以要用一个对象把这些程序组织起来,另外每一个方法中都要用到request和response,所以说在每个业务中都要把request和response传进来。

 

二、 对外暴露的函数

1、第一个对外暴露的函数:函数model.experts,第一个指标处理用户请求index求这个业务,假设这个方法,并且发现这个方法是用户get请求Index或者get路径,直接给experts的index的方法,是被对象加了index的方法,这个方法中有两个参数,Request和response。

2、正确的handle.js模块

module.experts = { } ;

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()来执行当写入数据完毕后的操作

callback();

});

}

// 分装一个获取用户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,访问一下首页。

 

相关文章
|
20天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
18天前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
114 52
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
20天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
29 5
|
21天前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
24 1
|
1月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
38 7
|
1月前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
1月前
|
JavaScript 前端开发 开发者