~~~
//该模块负责封装所有路由判断代码
var fs=require('fs');
var path=require('path');
var querystring=require('querystring');
module.exports = function(req, res) {
//根据用户请求的路径,将对应的html页面显示出来
if (req.url === '/' || req.url === '/index' && req.method === 'get') {
readNewsData(function(arr) {
//2.在服务器端使用模板引擎,将arr中的数据和index.html文件中的内容结合,渲染给客户端
res.render(path.join(__dirname, 'views', 'index.html'), { arr: arr });
});
} else if (req.pathname === '/item' && req.method === 'get') {
//读取detail.html并返回
//1.获取当前用户请求的新闻的id
//urlObj.query.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) {
res.render(path.join(__dirname, 'views', 'detail.html'), { item: model });
} else {
res.end("NO such item");
}
});
} else if (req.url === '/submit' && req.method === 'get') {
//读取submit.html并返回
res.render(path.join(__dirname, 'views', 'submit.html'));
} else if (req.url.startsWith('/add') && req.method === 'get') {
readNewsData(function(arr) {
req.query.id = arr.length;
arr.push(req.query);
writeNewsData(JSON.stringify(arr), function() {
res.writeHead(302, 'Found', { 'Location': '/' });
res.end();
});
});
} else if (req.url === '/add' && req.method === 'post') {
//1.读取data.json文件中的数据
readNewsData(function(arr) {
//2.读取用户post提交的数据
postData(req, function(postBody) {
//3.为用户提交的新闻增加一个id属性,并把新闻对象push到arr数组中
postBody.id = arr.length;
arr.push(postBody);
//4.将新的list写入到data.json文件中
writeNewsData(JSON.stringify(arr), function() {
res.writeHead(302, 'Found', { 'Location': '/' })
res.end();
});
})
});
} else if (req.url.startsWith('/resources') && req.method === 'get') {
//如果用户请求是以/resources开头,并且是get请求,就认为用户是要请求静态资源
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.");
}
}
//封装读取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 arr = JSON.parse(data || '[]');
//通过调用回调函数callback()将读取到的数据arr 传递出去
callback(arr);
});
}
//封装写入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 postData(req, callback) {
var list = [];
req.on('data', function(chunk) {
list.push(chunk);
});
req.on('end', function() {
var postBody = Buffer.concat(list);
postBody = postBody.toString('utf8');
postBody = querystring.parse(postBody);
//把用户post提交的数据传递出去
callback(postBody);
});
}
~~~
//index.js
~~~
var router=require('./router.js');
//调用router.js模块的返回值(函数),并将req 和res 对象传递给router.js模块
router(req,res);
~~~
- node.js
- 第一章 node.js介绍
- 第二章 node.js安装和配置
- 第三章 node.js开发网站和传统php等开发网站的区别
- 第四章 REPL介绍
- 第五章 创建javascript文件编写程序
- 第六章 写入文件操作
- 第七章 异步操作
- 1.try-catch
- 第八章 读取文件
- 第九章 __dirname和__filename获取正在执行的js文件的路径
- 第十章 通过path模块进行路径拼接
- 10.1 作业:创建文件夹
- 第十一章 编写http服务程序
- 1.通过服务器端设置响应报文头解决乱码问题
- 2.通过设置http响应报文头来解决浏览器显示html问题
- 3.根据不同请求做出不同响应
- 4.根据用户不同请求-读取不同的html文件响应
- 5.根据用户不同请求,返回不同html文件(带图片)
- 6.根据用户不同请求,返回不同html文件(带css)
- 7.模拟apache
- 第十二章 请求url就是一个标示符
- 第十三章 request和response对象介绍
- 13-1 request对象
- 13-2 response对象
- 第十四章 npm介绍
- node.js进阶
- 1.Modules和Packages区别
- 2.package.json文件介绍
- 3.package-lock.json文件介绍
- 4.HackerNews项目
- 4.1 搭建代码结构
- 4.2 根据不同路由响应不同的html页面
- 4.3 封装render函数
- 4.4 render函数挂载到res上
- 4.5 获取用户get提交的数据
- 4.6 将用户提交的数据写入到data.json文件中
- 4.7 浏览器重跳转
- 4.8 get方式提交数据被覆盖
- 4.9 post方式请求提交
- 4.10 underscore
- 4.11 显示从submit添加进来的数据
- 4.12 添加新闻时增加一个id属性
- 4.13 显示新闻详情
- 4.14 封装读取data.json文件的方法
- 4.15 封装写入data.json文件的方法
- 4.16 封装获取用户post提交的数据的方法
- 4.17 总结:使用封装的函数改造原来的代码
- 0.项目地址
- 5. require加载机制
- 5-1 node.js中模块的分类
- 5-2 require函数加载模块原理
- 6. CommonJS规范
- 7.module.exports
- 8. exports和module.exports的区别
- 9. HackerNews项目优化
- 9-1 模块化思路
- 9-2 封装context.js模块
- 9-3 提取router.js模块
- 9-4 提取handler.js模块(handler.index方法封装)
- 9-4 提取router.js模块02(顺带封装handler.js模块中的方法)
- 9-5 模块化后代码执行顺序
- 9-6 封装config.js模块
- node.js2
- 1. buffer类型介绍
- 2. express框架
- 2.1 expres实现hello world
- 2.2 res.send()和res.end()的区别
- 2.3 app.get和app.use注册路由的区别
- 2.4 app.all()注册路由
- 2.5 通过正则表达式注册路由
- 2.6 通过req.params获取路由中的参数
- 2.7 通过express模拟Apache实现静态资源托管服务
- 2.8 res对象的常见方法
- 3.基于express的hackernews项目
- 3.1 封装路由模块
- 3.2 封装handler.js模块
- 3.3 res.sendFile和res.render
- 3.4 ejs模板引擎使用
