开发者学堂课程【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 ur
lo
bj . url. parse(req. url. toLowerCase(), true);
//1.为req增加query属性
req.query . ur
lo
bj . query;
//2.为req增加pathname属性
req. pathname . ur
lo
bj. 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,如下图所示:
首页、详情、添加都没有问题,测试完成。