一个相对健壮的node 静态http服务器
2015-08-06 09:12
597 查看
先上代码,然后说说坑,算是一个总结,以后在mac上就用这个开启服务调试了,挺好。然后接着想写一个动态的返回页面的,刚好练手mv*的框架。
第一个是不要用foreach去遍历数组,这是对象的方法,尽管可以用来遍历数组但是经常会冒出来一些奇怪的东西,使用有风险。
第二个就是node返回文件的要注意你是以什么格式返回的
第三个就是异步的问题,异步的写法不是那么好写的,要时刻注意变量的值的改动和异步执行的逻辑流。
说一下程序的大体思路,
最简单的返回文件的http服务器有一个问题就是,如果请求一个并不存在的文件,服务器就会挂掉,这个简单,我们做一个过滤就好了,当请求一个并不存在的文件的时候返回404即可,所以就要维护一个文件dir的对象或者数组,我用的数组,感觉用对象还是有一些便利的,或者也可以使用类数组。然而,我们并不能把数组或者对象写死,因为服务器www目录下的文件不是一成不变的,所以我们要去readdir,然而每来一次请求就readdir很麻烦,效率也低,所以我们就watchdir的变动,这边有一个要注意的地方就是我们要知道它是append还是remove文件这个要自己写一下,所以,这样一旦www目录下有changed事件就去upadate数组,然后就可以防范请求不存在的文件而使得服务器挂掉的情况。
var http = require('http'); var fs = require('fs'); var url = require('url'); var filedir = []; fs.readdir('www',function(err,file){ console.log('readdir'); lengthlast = file.length;//initzien lengthlast console.log('lengthlast:'+lengthlast); if (err) { throw('you have no "www" dir'); }; for(var n=0;n<file.length;n++){ filedir =file ; } fs.watch('www',function(event,filename){//observe dir.if dir is not changed,it doesn't work; someting error if (filename!== '.DS_Store') { print(filename+'changed'); fs.readdir('www', function(err,file){ if (err) { ; }; if (file.length>lengthlast) {//append file filedir.push(filename); lengthlast = file.length; console.log('append:'+lengthlast); } else{ for(var j = 0;j<filedir.length;j++){ if (filedir[j]==filename) { filedir.splice(j,1); lengthlast = file.length; console.log('remove:'+lengthlast); }; } print(file); } }) } }); http.createServer(function(req,res){ var length = filedir.length; console.log('connact server'); var urlobj = url.parse(req.url); if(urlobj&&urlobj.path!=='/favicon.ico'){ var filepath = urlobj.path; } if (filepath == undefined) { res.writeHead(200,{ 'Content-Type':'text/html' }); res.end('404 NOT FOUND'); return; }; function removefirst(str){ var string = str; var arr = string.split(''); arr.shift(); return arr.join(''); } var reqfile=removefirst(filepath); for(var i=0;i<length;i++){//loop 2 ? why if ('/'+filedir[i]==filepath) { var data = fs.readFileSync('www'+filepath);//这里异步有问题,你异步去读文件,但是循环继续了,很快完成,报not found 文件来了已经over res.writeHead(200,{ 'Content-Type':'text/html' }); if (!data) { res.end('something erro'); }; res.write(data,'bindary'); res.end(); break; }; if (i==(length-1)) { res.end('404 NOT FOUND'); }; } }).listen(8080,'127.0.0.1'); }); console.log("server start"); function print(something){ console.log(something); }
第一个是不要用foreach去遍历数组,这是对象的方法,尽管可以用来遍历数组但是经常会冒出来一些奇怪的东西,使用有风险。
第二个就是node返回文件的要注意你是以什么格式返回的
第三个就是异步的问题,异步的写法不是那么好写的,要时刻注意变量的值的改动和异步执行的逻辑流。
说一下程序的大体思路,
最简单的返回文件的http服务器有一个问题就是,如果请求一个并不存在的文件,服务器就会挂掉,这个简单,我们做一个过滤就好了,当请求一个并不存在的文件的时候返回404即可,所以就要维护一个文件dir的对象或者数组,我用的数组,感觉用对象还是有一些便利的,或者也可以使用类数组。然而,我们并不能把数组或者对象写死,因为服务器www目录下的文件不是一成不变的,所以我们要去readdir,然而每来一次请求就readdir很麻烦,效率也低,所以我们就watchdir的变动,这边有一个要注意的地方就是我们要知道它是append还是remove文件这个要自己写一下,所以,这样一旦www目录下有changed事件就去upadate数组,然后就可以防范请求不存在的文件而使得服务器挂掉的情况。
相关文章推荐
- php笔记07:http响应详解(禁用缓存设置和文件下载)
- 【网络测试】IPV4协议族
- HTTP常用对照表(content-type、HTML转义字符、ASCII、TCP常用端口等)
- Node.js开发入门—HTTP文件服务器
- Linux-C网络编程之select函数
- 读 HTTP 协议
- 算法设计与分析:第六章 图 6.3网络最大流问题
- VirtualBox 使用 NAT 方式网络的 SSH 连接
- 校园网络TV云平台
- 网络图片浏览器异常问题
- TCP/IP Socket HTTP
- HDU 5352 MZL's City(网络流)
- 使用Volley加载网络图片
- hdu 4038 2011成都赛区网络赛H 贪心 ***
- TCP/IP协议栈的基本工作原理
- Windows Sockets 网络编程——第三章 TCP/IP协议服务
- yii2关于HTTP请求处理的总结
- [网络流24题] 17 运输问题(网络费用流量,最小费用最大流)
- 【linux高级程序设计】(第十五章)UDP网络编程应用 2
- hdu 4036 2011成都赛区网络赛F 模拟 **