提取 router.js 模块02(顺带封装 handler.js 模块中的方法)|学习笔记

简介: 快速学习提取 router.js 模块02(顺带封装 handler.js 模块中的方法)

开发者学堂课程【Node.js 入门与实战:提取 router.js 模块02(顺带封装 handler.js 模块中的方法)】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/588/detail/8306


提取router.js模块02(顺带封装handler.js模块中的方法)

 

1、第二个要封装用户请求submit路由处理代码,

//读取submit.html并返回,//res,render(path.join(_dirname, 'views’,’submit.html’));

直接就渲染,路由模块里面,路由判断完毕之后这只有一句话,也需要封装,因为就算只有一句话,这也属于是它的业务,它目前的业务只有一句话,但不能保证这个业务以后也只有一句话,当用户请求submit时只返回一句话,但是以后可能这个业务会比较复杂,所以这无论代码有多少,只要是属于不同模块的不同职责代码就一定要提出来。

2、在业务模块当中,

//处理请求/和/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 ‘));

};

当用户请求submit直接读取文件返回就可以了。

3、在路由模块router.js中,

//先根据用户请求的路径(路由),将对应的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);

这样就封装了submit的业务代码,封装完毕之后再测试一下,点击submit,查看是否有问题,没有问题。

image.png

4、处理新闻详情的页面,在handler.js业务模块中添加

//处理请求/item 的业务方法(显示新闻详情)

module . exports.item = function (req, res) {

body

};

把这些代码拷贝到业务代码body位置,并把注释取消。

// 1.获取当前用户请求的新闻的id

// 2. 读取data.json文件中的数据,根据id找到对应新闻

//  readNewsData( function(list_ news ){

// var model = null;

// 循环list_ news中的数据,找到和id值相等的数据

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' );

}

});

5、在router.js中添加handler.item(req, res); 封装新闻详情。测试一下新闻详情是否可用,这样的好处就是如果除了问题可以及时发现,还是访问localhost:

9090,随便点一个,可以直接显示,证明item封装也是OK的。

image.png

6、用get方式添加新闻,在router.js拷贝代码,粘贴在handler.js中,格式化一下代码,这个方法名叫addget。

//处理get方式添加新闻

Module.exprots.addget=function(req,res){

//1.读取data.json 文件的数据

readNewsData(function(list) {

//2.

//在把新闻添加到list之前,为新闻增加一个id属性

req .query.id=list. length;

//向数组对象list 中push一条新闻

list. push(req. query);

//3.写入data.json 文件

writeNewsData ( JSON. stringify( list) , function (){

//重定向

res.statusCode = 302;

res.statusMessage=’Found';

res.setHeader(‘ Location",’/');

res . end();

});

});

在 router.js 路由模块中添加 handler.addget(req,res),

}else if ( req. pathname ===' /add' && req . method===get' ){

handler. addGet(req, res) ;

}else if(req . url===" /add' &&req . method===post' ){

7、测试一下get方式添加新闻,需要在views中submit.html里表单方式改成get,重新测试,测试结果如下。

image.png

8、封装完毕之后,在路由模块中还有一个post模块添加新闻,点击业务模块,在封装一个,代码如下。

//处理post方式添加新闻

module . exports . addPost =function(req, res) {

//1.读取 data. json

readNewsData(function(list) {

// 2.读取用户post提交的数据

postBodyData(req, function(postData) {

// 3.为用户提交的新闻增加一个id属性,并且把新闻对象push 到list中

postData.id=list. length;

list . push(postData);

// 4.将新的list数组,在写入到data.json 文件中

writeNewsData(JSON. stringify(list), function() {

//重定向

res. statusCode = 302 ;

res . statusMessage =" Found' ;

res. setHeader( ' Location ' ,’/');

res . end();

});

9、在路由模块router.js中添加handler.addpost(req,res),在submit.html中把表单改成post方式,再进行测试,测试结果如下,封装完毕。

image.png

10、处理静态资源也需要封装,封装的时候无论代码量多少,只要对

应的是业务模块或者路由模块,只要它是在不同模块里面就一定要封装。

今天它是一个代码,不能保证以后还是一个代码。把以下代码单独提取出来,找到业务模块,添加进去,格式化一下。

module . exports.static = function (req, res) {

//如果用户请求是以/resources 开头, 并且是 get请求,就认为用户是要请求静态资源

//resources/ images/s. gif

res . render( path . join(__dirnamereq.url));

};

在路由模块中把它改造一下,进行测试,如果图片css都能显示就证明是OK的。

} else if (req. url. startsWith( . /resources' )&&req . method===’get' ){

handler. static(req, res);

image.png

最后的404也需要封装,把代码拷贝到handler.js中,简单返回了一个404,处理错误的一个方法。

//处理404错误请求

module . exports.handleErroes= function (req, res) {

res . writeHead(404,  ' Not . Found' , {

‘Content-Type': ’text/html; charset=utf-8'

});

res . end( '404, Page Not Found.');

}

在 router.js 中,添加 handler.handleErroes(req,res);

再看路由模块,就是很简单的if判断,对于不同路由只是做了路由判断而已,具体的处理代码都是调的别的模块处理的,这就是路由模块,路由模块封装完毕之后,里面处理都是调用业务模块,业务模块封装了不同的处理方法,每个方法都是针对不同的路由进行处理,最终在路由模块中调用对应的业务模块实现处理,在业务模块中要用的这些方法去单独封装到业务模块里面。

//加载 handler.js 模块

var handler= require(' . /handler.js');

var path=require( path' );

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 ===" /add' && req. method === 'post') {

handler. addPost(req, res);

}else if (req . url. startsWith( ‘/resources') && req . method === 'get') {

handler.static(req, res);

}else {

handler . handleErrors(req, res);

};

}

测试一下,输入一个不存在的页面,服务器没有崩溃。

image.png

再访问正确的网站,可以正常显示。这就是路由模块和业务模块的提取。

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