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

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

  1 var http = require(‘http‘);
  2 var fs = require(‘fs‘);
  3 var url = require(‘url‘);
  4 var filedir = [];
  5 fs.readdir(‘www‘,function(err,file){
  6     console.log(‘readdir‘);
  7     lengthlast = file.length;//initzien lengthlast
  8     console.log(‘lengthlast:‘+lengthlast);
  9     if (err) {
 10         throw(‘you have no "www" dir‘);
 11     };
 12 for(var n=0;n<file.length;n++){
 13     filedir[n]=file[n];
 14 }
 15
 16 fs.watch(‘www‘,function(event,filename){//observe dir.if dir is not changed,it doesn‘t work; someting error
 17     if (filename!== ‘.DS_Store‘) {
 18         print(filename+‘changed‘);
 19         fs.readdir(‘www‘, function(err,file){
 20             if (err) {
 21                 ;
 22             };
 23             if (file.length>lengthlast) {//append file
 24
 25             filedir.push(filename);
 26             lengthlast = file.length;
 27             console.log(‘append:‘+lengthlast);
 28             }
 29             else{
 30
 31                 for(var j = 0;j<filedir.length;j++){
 32                     if (filedir[j]==filename) {
 33                         filedir.splice(j,1);
 34                         lengthlast = file.length;
 35                         console.log(‘remove:‘+lengthlast);
 36                     };
 37                 }
 38                 print(file);
 39             }
 40         })
 41     }
 42
 43 });
 44
 45 http.createServer(function(req,res){
 46     var length = filedir.length;
 47     console.log(‘connact server‘);
 48     var urlobj = url.parse(req.url);
 49     if(urlobj&&urlobj.path!==‘/favicon.ico‘){
 50     var filepath = urlobj.path;
 51 }
 52
 53
 54     if (filepath == undefined) {
 55
 56         res.writeHead(200,{
 57         ‘Content-Type‘:‘text/html‘
 58     });
 59     res.end(‘404 NOT FOUND‘);
 60         return;
 61     };
 62
 63     function removefirst(str){
 64     var string = str;
 65     var arr = string.split(‘‘);
 66     arr.shift();
 67     return arr.join(‘‘);
 68    }
 69    var reqfile=removefirst(filepath);
 70
 71
 72     for(var i=0;i<length;i++){//loop 2 ? why
 73
 74         if (‘/‘+filedir[i]==filepath) {
 75
 76         var data = fs.readFileSync(‘www‘+filepath);//这里异步有问题,你异步去读文件,但是循环继续了,很快完成,报not found 文件来了已经over
 77
 78         res.writeHead(200,{
 79         ‘Content-Type‘:‘text/html‘
 80     });
 81         if (!data) {
 82         res.end(‘something erro‘);
 83         };
 84
 85         res.write(data,‘bindary‘);
 86         res.end();
 87         break;
 88         };
 89         if (i==(length-1)) {
 90
 91             res.end(‘404 NOT FOUND‘);
 92         };
 93     }
 94
 95
 96     }).listen(8080,‘127.0.0.1‘);
 97
 98
 99
100
101 });
102 console.log("server start");
103
104 function print(something){
105     console.log(something);
106 }

第一个是不要用foreach去遍历数组,这是对象的方法,尽管可以用来遍历数组但是经常会冒出来一些奇怪的东西,使用有风险。

第二个就是node返回文件的要注意你是以什么格式返回的

第三个就是异步的问题,异步的写法不是那么好写的,要时刻注意变量的值的改动和异步执行的逻辑流。

说一下程序的大体思路,

最简单的返回文件的http服务器有一个问题就是,如果请求一个并不存在的文件,服务器就会挂掉,这个简单,我们做一个过滤就好了,当请求一个并不存在的文件的时候返回404即可,所以就要维护一个文件dir的对象或者数组,我用的数组,感觉用对象还是有一些便利的,或者也可以使用类数组。然而,我们并不能把数组或者对象写死,因为服务器www目录下的文件不是一成不变的,所以我们要去readdir,然而每来一次请求就readdir很麻烦,效率也低,所以我们就watchdir的变动,这边有一个要注意的地方就是我们要知道它是append还是remove文件这个要自己写一下,所以,这样一旦www目录下有changed事件就去upadate数组,然后就可以防范请求不存在的文件而使得服务器挂掉的情况。

时间: 2024-11-05 13:39:08

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

使用node搭建静态资源服务器(2)

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能. 静态资源的压缩 //compress.js module.exports = (rs,req,res) => { const acceptEncoding = req.headers['accept-encoding']; if(!acceptEncoding || !acceptEncoding.match(/\b(gzip|defalte)\b/)) { return rs; }else if(

Go语言实现简单的一个静态WEB服务器

Android SDK的文档直接打开的话会很慢,而且不支持搜索.所以,本地搭建静态服务器是必要的.以下为引用的其他博客的资源,感谢作者. 首先,搭建一个静态的服务器 我写程序喜欢使用HTML通过AJAX发送JSON请求到后端处理. HttpServer.go 代码如下: package main import (         "flag"         "io/ioutil"         "log"         "net/

HTTP静态资源服务器搭建

1.搭建服务器原因 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础.这个步骤是系统架构从猿进化成人的必经之路. 核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互. 在互联网架构中: Web服务器:一般指像nginx

nginx配置静态web服务器

配置静态的web,需要实现一个虚拟主机. step1: 准备工作 1  查看你的网卡地址(我的 192.168.223.135) #ifconfig 我们这里建立两个web服务器,所以增加一个网卡地址. #ifconfig eth0:0  192.168.223.145 2 建立两个站点目录 #mkdir  /var/tmp/website1 #mkdir  /var/tmp/website2 3 建立两个日志目录 #mkdir  /var/tmp/log/website1 #mkdir  /v

Nginx作为静态内容服务器(Windows环境)

1.简单安装 1)下载 http://nginx.org/en/download.html 2)解压后的路径 E:\Study\nginx\nginx-1.7.6 3)执行nginx.exe,访问http://localhost ,出现Welcome to nginx!欢迎内容,安装成功. 4)在安装路径的logs目录下,会自动生成一个nginx.pid文件,文件内容就是nginx的主进程pid. 2.简单使用命令 nginx -s stop 快速停止 nginx -s quit 安全退出(会处

一个基于AIO实现的简单web服务器

一下是一个基于AIO实现的简单web服务器,这是一个简单例子 /** * 一个简单的web 服务器<br/> * 通过浏览器输入localhost:8080/访问 * * @author Joeson * @since 2014/05 * */ public class AioServer implements Runnable { private AsynchronousChannelGroup asyncChannelGroup; private AsynchronousServerSoc

【学习Koa】原生koa2 静态资源服务器例子

实现思路 首先读取当前路径下所有的文件和文件夹 当去点击某个列表项时判断其实文件还是文件夹,文件的话直接读取,文件夹则再次利用上一个步骤读取并展示 文件结构 代码 index.js 入口文件 const Koa = require('koa') const path = require('path') const getContent = require('./util/content') const mimes = require('./util/mimes') const app = new

Nginx——静态资源服务器(一)

java web的项目中,我们经常将项目部署到Tomcat或者jetty上,可以通过Tomcat或者jetty启动的服务来访问静态资源.但是随着Nginx的普及,用Nginx来作为静态资源服务器,似乎有着更高的性能.接下来的Nginx--静态资源服务器系列随笔,我想探讨以下几个问题: Nginx作为静态资源服务器,有什么优势? Nginx如何和tomcat结合起来使用? Nginx如何搭建CDN? 等等 静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html.css.js).图片

Node.js创建服务器和模拟客户端请求

1. 何为服务器 服务器是某种长期运行,等待请求资源的应用程序 2. 常见Web应用架构 3. 如何创建web服务器 Web服务器是使用HTTP协议,等待客户端连接后请求资源的驻守应用程序:HTTP协议是应用层的协议,在传输层依然是使用TCP或者UDP协议,一般来说是使用Socket来绑定TCP或者UDP,总的来说创建服务器就是创建一个Socket: 创建服务器的流程: (1)创建Socket (2)为Socket绑定参数 (3)Socket等候请求 (4)处理请求,返回资源 (5)关闭资源 4