开发者学堂课程【Node.js 入门与实战:get方式提交新闻防止新闻被覆盖掉】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/588/detail/8281
get方式提交新闻防止新闻被覆盖掉
get方式提交新闻防止新闻被覆盖掉
1. 代码如下:
//封装一个render()函数
//将 render函数挂在到res对象上,可以通过res.render()来访问
//实现 get方式添加新闻
//-实现在原来list数组的基础上追加新闻,而不是覆盖
//1.加载 http模块
var http = require( 'http');
var fs = require( 'fs');
var path = require( " path');
var mime = require( " mime ' );
var url = require("url');
// 2.创建服务
http.createServer(function (req,res){
//要在这里写大量的代码
//为res对象添加一个 render()函数,方便后续使用
res.render = function (filename) {
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;
}
res.setHeader( ' Content-Type' , mime.getType(filename));
res.end(data);
});
};
//设计路由
//当用户请求/或/index时,显示新闻列表-get请求
//当用户请求/item时,显示新闻详情- get请求
//当用户请求/submit 时,显示添加新闻页面- get请求
//当用户请求/add时,将用户提交的新闻保存到data.json 文件中- get 请求
//当用户请求/add 时,将用户提交的新闻保存到 data. json 文件中- post 请求//将用户请求的 url 和 method 转换为小写字母
req.url = req. url. toLowerCase();
req. method = req . method . toLowerCase();
//通过 url 模块,调用 url.parse() 方法解析用户请求的 url (req.url )
var ur10bj = url.parse(req.url, true);
// console. log(ur10bj);
// url0bj.query.title
//先根据用户请求的路径(路由),将对应的HTML页面显示出来
if (req.url === '/' 1 req.url == ' /index' && req. method === ' get') {
//读取 index. html
res . render(path. join(__ dirname, 'views' ,' index.html'));
} else if (req.url === ' /submit' && req . method === 'get') {
//读取 submit.html 并返回
res . render( path.join(__ dirname, 'views', ' submit.html'));
} else if (req.url == ' /item' && req. method === ' get' ) {
//读取 details.html 并返回
res. render(path. join(__ dirname, 'views', ' details.html'));
} else if (req .url.startsWith( /add') && req . method === 'get') {
//1.1读取 data.json 文件中的数据,并将的u渠道的数据文件转换为一个数组
//此处,读取文件的时候可以直接写一个utf8 编码,这样的话,回调函数中的data 就是一个字符串了
fs.readFile(path. join(__ dirname, 'data', 'data.json'), 'utf8', function (err, data) {
//因为第一次访问网站, data.json 文件本身就不存在,所以肯定是有错误的
//但是这种错误,我们并不认为是网站出错了,所以不需要抛出异常
if (err && err.code !== ' ENOENT') {
throw err;
}
//如果读取到数据了,那么就把读取到的数据data, 转换为list数组
//如果没有读取到数据,那么就把'[]' 转换为数组
var list = JSON.parse(data 11 '[]');
});
list. push(url0bi. query);
// 2.把用户提交的新闻数据保存到data. json 文件中
//把list数组中的数据写入到data.json 文件中
fs .writeFile(path. join(__ dirname, 'data', 'data . json'), JSON. stringify(list),function (err) {
if (err) {
throw err;
}
console.log('ok' );
// 设置响应报文头,通过响应报文头告诉浏览器,执行一次页面跳转操作
//3.跳转到新闻列表页
//重定向
res . statusCode = 302 ;
res.statusCode = ‘Found’;
res.setHeader(‘Location’,’/’);
res.end();
});
});
}else if (req.url === ' /add' 8& req . method === 'post') {
//表示post方法提交一条新闻
}else if (req. url. startswi th(' /resources') && req . method === 'get') {
//如果用户请求是以/resources 开头,并且是get 请求,就认为用户是要请求静态资源
//resources/images/s.gif
res. render(path. join(__ dirname, req .ur1));
} 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’);
});
2.代码解说:
当用户通过get方法提交过来一条数据的时候,我们首先第一步要读取原有文件中的数据,然后转成list数组。
3.执行代码如下:
C: Users\Humble\Desktop
\12期\e3-HackerNers\02-理代码\课堂代码\01-hackernews(05-hackernews91.0.0)
入node index4.js
http://localhost :9090
浏览器中访问结果:
点击submit提交跳转出现重定向提交到首页的结果查看页面(也可搜索json格式化查看):