~~~
//当前项目(包)的入口文件
//实现get方式添加新闻
//1.加载http模块
var http =require('http');
var fs=require('fs');
var path=require('path');
var mime=require('mime');
//加载url模块
var url=require('url');
//2.创建http服务
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,page 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 urlObj=url.parse(req.url,true);
console.log(urlObj);
//根据用户请求的路径,将对应的html页面显示出来
if(req.url==='/'||req.url==='/index'&&req.method==='get'){
//读取index.html 并返回
res.render(path.join(__dirname,'views','index.html'));
}else if(req.url==='/item'&&req.method==='get'){
//读取detail.html并返回
res.render(path.join(__dirname,'views','detail.html'));
}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'){
//表示get方法提交一条新闻
//要获取用户提交过来的数据,需要用到url模块(这个模块是node.js内置模块,不是第三方模块)
//1.获取用户get提交过来的新闻数据
//urlObj.query.title
//urlObj.query.url
//urlObj.query.text
//2.1读取 data.json文件中的数据,并将读取到的数据转化为一个数组
//此处读取文件的时候可以直接写一个utf8编码,这样的话,回调函数中的data就是一个字符串了
fs.readFile(path.join(__dirname,"data",'data.json'),'utf8',function(err,data){
//因为第一次访问网站 ,data.json文件本身就不存在,所以肯定是有错误的,但是这种错误,我们并不认为是网站出错了,所以不需要抛出异常
//ENOENT没有这样的文件或者目录
if(err&&err.code !=='ENOENT'){
throw err;
}
//如果读取到了数据,就把读取到的数据data转换成arr数组,相反如果没有读取到数据就把[]转换为数组
var arr=JSON.parse(data ||'[]');//字符串解析为数组
arr.push(urlObj.query);
//2.把用户提交的数据保存到data.json文件中
//把arr数组中的数据写入到data.json文件中
fs.writeFile(path.join(__dirname,'data','data.json'),JSON.stringify(arr),function(err){
if(err){
throw err;
}
console.log('ok');
//3.跳转到新闻列表页
//通过设置http响应报文头实现浏览器重定向操作
//以3开头的都表示要做跳转
res.writeHead(302,'Found',{'Location':'/'})
res.end();
});
});
}else if(req.url==='/add'&&req.method==='post'){
//表示post方法提交一条新闻
}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.");
}
}).listen(8888,function(){
console.log("http://localhost:8888");
})
~~~

- 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模板引擎使用
