测试使用 Context.js 模块|学习笔记

简介: 快速学习测试使用 Context.js 模块

开发者学堂课程【Node.js 入门与实战测试使用Context.js模块】学习笔记,与课程紧密联系,让用户快速学习知识

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


测试使用Context.js模块

 

基本内容

一、context.js

二、index.js

执行

 

一、context.js

//该模块负责对 req 和 res 对象进行扩展;

//希望在该模块中做什么:

// 1.为 req 增加一个 query 属性,该属性中保存的就是用户get请求提交过来的数据

// - req. Query

//2.为 req 增加一个 pathname 属性

// - req .pathname

// 3.为res增加一个 render 函数

var url - require('url' ) ;

var fs = require('fs');

var mime = require(‘ mime );

var _ = require( ‘underscore');

//让当前模块对外暴露一个函数,通过这个函数将 index.js 中的 req 和 res 传递到当前 context.js 这个模块中

module .exports - function(req, res) {

var urlobj . url. parse(req. url. toLowerCase(), true);

//1.req增加query属性

req.query . urlobj . query;

//2.为req增加pathname属性

req. pathname . urlobj. pathname;

// 3.把请求方法req.method 转换为小写

req. method . req . method . toLowerCase();

// 4.为res 增加一个render 函数

res .render . function(filename, tplData) {

fs.readFile(filename, function(err, data) {

if (err) {

res .writeHead(404, 'Not Found', { . Content-Type': . text/html;charset-utf-8' });

res. end( .404, not found.' ) ;

return;

}

//如果用户传递了模板数据,那么就使用 underscore 的 template 方法进行替换

//如果用户没有传递模板数据,那么就不进行替换

if (tplData) {

//如果用户传递了模板数据,表示要进行模板替换

var fn =  _. template(data . toString('utf8’));

data =  fn(tplData);

}

res . setHeader( ' Content-Type ' , mime . getType(filename)) ;

res .end(data) ;

});

});

});


二、index.js

//先根据用户请求的路径(路由),将对应的 HTML 页面显示出来

if(req.pathname==='/'||req.pathname==='/index'&&req.method=== get' ) {

// 1.读取 data.json 文件中的数据,并将读取到的数据转换为 list 数组

readNewsData(function(list) {

// 2.在服务器端使用模板引擎,将 list 中的数据和 index.html 文件中的内容结合渲染给客户端

res . render(path. join(__ dirname, 'views', ' index.html'), { list: list });

});

} else if (req.url -.. ' /submit' && req. method === get') {

//读取 submit.html 并返回

res . render(path. join(_ _ dirname, 'views', ' submit.html'));

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

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

// url0bj.query.id

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

readNewsData(function(list_news) {

var model = null ;

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

for (var i = 0; i < list news .length; 1++) {

//判断集合中是否有与用户提交的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' );

});

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

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

readNewsData(function(list) {

// 2.

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

req.query.id . list . length;

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

reqpush(url0bj.query);

// 3.写入 data.json 文件

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

//重定向

res . statusCode=302 ;

res. statusMessage =" Found' ;

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

res . end();

});

});

});

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

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

//resources/images/s.gif

res . render(path. join(__ dirname, req .url));

}else

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

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

});

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

}

}).listen(9090, function() {

console. log(‘http://localhost:9090' );

});

//封装一个读取 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 II '[]');

//通过调用回调函数 callback() 将读取到的数据 list, 传递出去callback(list);

});

//封装一个写入 data.json 文件的函数

function writeNewsData(data, callback) { fs.writeFile(path.join(__dirname,'data',’data.json'),data,function(err) {

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. oncat(array);

//把获取到的 buffer 对象转换为一个字符串

postBody = pos tBody . toString( 'utf8');

//把 post 请求的查询字符串,转换为一个json对象

postBody = querystring. parse(postBody);

//把用户 post 提交过来的数据传递出去

callback(postBody);

});

}

 

三、执行

如果执行没问题那么证明 context 模块没有问题

找到 cmd重新启动 index如下图所示

访问9090,如下图所示

首页详情添加都没有问题测试完成

image.pngimage.png

相关文章
|
2月前
|
安全 Linux 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
66 2
|
2月前
|
Python Windows 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
68 2
|
2月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
46 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
2月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
245 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
2月前
|
计算机视觉
目标检测笔记(二):测试YOLOv5各模块的推理速度
这篇文章是关于如何测试YOLOv5中不同模块(如SPP和SPPF)的推理速度,并通过代码示例展示了如何进行性能分析。
110 3
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
47 2
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
72 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
2月前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
43 2
|
3月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
2月前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
33 0