您的位置:首页 > 理论基础 > 计算机网络

一个相对健壮的node 静态http服务器

2015-08-06 09:12 597 查看
先上代码,然后说说坑,算是一个总结,以后在mac上就用这个开启服务调试了,挺好。然后接着想写一个动态的返回页面的,刚好练手mv*的框架。

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数组,然后就可以防范请求不存在的文件而使得服务器挂掉的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: