一个相对健壮的node 静态http服务器
先上代码,然后说说坑,算是一个总结,以后在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[n]=file[n];
} 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数组,然后就可以防范请求不存在的文件而使得服务器挂掉的情况。
一个相对健壮的node 静态http服务器的更多相关文章
- node静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)
我们的目标是实现一个可访问静态文件的服务器,即可以在浏览器访问文件夹和文件,通过点击来查看文件. 1.先创建一个文件夹anydoor,然后在该文件夹里npm init一个package.json文件, ...
- 原生node写一个静态资源服务器
myanywhere 用原生node做一个简易阉割版的anywhere静态资源服务器,以提升对node与http的理解. 相关知识 es6及es7语法 http的相关网络知识 响应头 缓存相关 压缩相 ...
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- 使用Node.js搭建静态资源服务器
对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解.那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如 ...
- node 创建静态web服务器(下)(处理异步获取数据的两种方式)
接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...
- node 创建静态web服务器(上)
声明:本文仅用来做学习记录. 本文将使用node创建一个简单的静态web服务器. 准备工作: 首先,准备好一个类似图片中这样的页面 第一步: 创建 http 服务: const http = requ ...
- 极简 Node.js 入门 - 5.3 静态资源服务器
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器
第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...
- 使用 Express 实现一个简单的 SPA 静态资源服务器
背景 限制 SPA 应用已经成为主流,在项目开发阶段产品经理和后端开发同学经常要查看前端页面,下面就是我们团队常用的使用 express 搭建的 SPA 静态资源服务器方案. 为 SPA 应用添加入口 ...
随机推荐
- LeetCode之“字符串”:Valid Number(由此引发的对正则表达式的学习)
题目链接 题目要求: Validate if a given string is numeric. Some examples: "0" => true " 0.1 ...
- Mybatis源码之CallableStatementHandler
/** * @author Clinton Begin */ public class CallableStatementHandler extends BaseStatementHandler { ...
- 关于C语言程序条件编译的简单使用方法
#include <stdio.h> #include <stdlib.h> #define Mode //如果定义了Mode,那么就执行这个函数 #ifdef Mode vo ...
- Twemproxy分析
twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数. 由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补 ...
- 从ruby实现时间服务器ntp同步功能也谈“逆向工程”
本猫以前写asm和C的时候常常不忘"逆向"一把,后来写驱动的时候也用VM之类的搭建"双机"调试环境进行调试:也对于一些小的软件crack cd-key神马的不亦 ...
- Oracle官方文档学习路线图
- String内存分配
Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的 栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存 ...
- [ SSH框架 ] Hibernate框架学习之四(JPA)
一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口), ...
- 8 个最好的 jQuery 树形 Tree 插件
由于其拥有庞大,实用的插件库,使得 jQuery 变得越来越流行.今天将介绍一些最好的 jQuery 树形视图插件,具有扩展和可折叠的树视图.这些都是轻量级的,灵活的 jQuery 插件,它将一个无序 ...
- ImageMagick
http://blog.csdn.net/lan861698789/article/details/7738383 1.官网 http://www.imagemagick.org/script/ind ...