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

 

目录
打赏
0
0
0
0
116
分享
相关文章
在Node.js中,如何合理使用模块来避免全局变量的问题?
在Node.js中,如何合理使用模块来避免全局变量的问题?
163 71
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
193 69
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
135 0
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
189 80
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
150 58
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
JavaScript字符串的常用方法
在JavaScript中,字符串处理是一个非常常见的任务。JavaScript提供了丰富的字符串操作方法,使开发者能够高效地处理和操作字符串。本文将详细介绍JavaScript字符串的常用方法,并提供示例代码以便更好地理解和应用这些方法。
111 13

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问