提取 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,访问一下首页。

 

相关文章
|
15天前
|
JavaScript 前端开发
JavaScript基础知识-方法
文章通过示例代码讲解了JavaScript中如何给对象添加方法以及如何调用这些方法。
17 2
JavaScript基础知识-方法
|
15天前
|
JavaScript 前端开发
JavaScript基础知识-数组的常用方法
关于JavaScript基础知识-数组的常用方法。
14 1
JavaScript基础知识-数组的常用方法
|
20天前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
7天前
|
设计模式 JavaScript
JS发布订阅模式封装(纯手工)
发布订阅模式是JS常用的设计模式,在面试中也会经常遇到,以下是我的手写实现方式,经测试效果不错,小伙伴们们可以直接拷贝使用。
|
8天前
|
Web App开发 前端开发 JavaScript
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
|
13天前
|
前端开发 JavaScript
前端ES5 | js —添加元素方法
前端ES5 | js —添加元素方法
|
9天前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
这篇文章介绍了在Nest.js构建应用时,如何通过事件/发布-订阅模式使应用程序更健壮、灵活、易于扩展,并简化服务间通信。文章主要围绕@nestjs/event-emitter模块展开,这是一个基于eventemitter2库的社区模块,提供了事件发布/订阅功能,使得实现事件驱动架构变得简单。文章还介绍了如何使用该模块,包括安装依赖、初始化模块、注册EventEmitterModule、使用装饰器简化监听等。最后总结,集成@nestjs/event-emitter模块可以提升应用程序的事件驱动能力,构建出更为松耦合、易扩展且高度灵活的系统架构,是构建现代、响应迅速且具有高度解耦特性的Nest.
|
15天前
|
缓存 JavaScript 前端开发
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
16 2
|
17天前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
41 0
|
18天前
|
移动开发 前端开发 JavaScript
前端表单验证的完美攻略:HTML5属性与JavaScript方法的无缝对接,让你的Web应用数据输入既安全又优雅
【8月更文挑战第31天】本文介绍前端表单验证的重要性及其实现方法,利用HTML5的内置属性如`required`、`pattern`和`minlength`进行基本验证,并借助JavaScript处理复杂逻辑,如密码确认。通过示例代码详细展示了如何结合两者实现高效且友好的表单验证,同时使用CSS增强用户体验。此方法简化开发流程并提升验证效果。
22 0