先上代码,然后说说坑,算是一个总结,以后在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服务器的更多相关文章

  1. node静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)

    我们的目标是实现一个可访问静态文件的服务器,即可以在浏览器访问文件夹和文件,通过点击来查看文件. 1.先创建一个文件夹anydoor,然后在该文件夹里npm init一个package.json文件, ...

  2. 原生node写一个静态资源服务器

    myanywhere 用原生node做一个简易阉割版的anywhere静态资源服务器,以提升对node与http的理解. 相关知识 es6及es7语法 http的相关网络知识 响应头 缓存相关 压缩相 ...

  3. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  4. 使用Node.js搭建静态资源服务器

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解.那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如 ...

  5. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  6. node 创建静态web服务器(上)

    声明:本文仅用来做学习记录. 本文将使用node创建一个简单的静态web服务器. 准备工作: 首先,准备好一个类似图片中这样的页面 第一步: 创建 http 服务: const http = requ ...

  7. 极简 Node.js 入门 - 5.3 静态资源服务器

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器

    第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...

  9. 使用 Express 实现一个简单的 SPA 静态资源服务器

    背景 限制 SPA 应用已经成为主流,在项目开发阶段产品经理和后端开发同学经常要查看前端页面,下面就是我们团队常用的使用 express 搭建的 SPA 静态资源服务器方案. 为 SPA 应用添加入口 ...

随机推荐

  1. android 股票K线图

    现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下. 下面是做出来的效果图: 这个 界面 ...

  2. Erlang Rebar 使用指南之一:入门篇

    Erlang Rebar 使用指南之一:入门篇 全文目录: https://github.com/rebar/rebar/wiki 本章原文: https://github.com/rebar/reb ...

  3. LeetCode(33)-Pascal's Triangle II

    题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...

  4. masm6.11的BUG?

    mov eax,[ebp + eax] ;->DS: mov eax,[eax + ebp] ;->SS: 上述2行代码生成的机器码反了,据说masm8也有此问题,但是masm9是正常的.

  5. 和菜鸟一起学linux之initramfs方式启动

    关于initramfs initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被加载到ram中.initramfs被解析处理后原 ...

  6. C# 合并多种格式文件为PDF

    文档合并是一种高效文档处理方式.如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利.因此,本篇文章介绍了一种如何使用免费组件Free Spire.O ...

  7. navicat for mysql远程连接ubuntu服务器的mysql数据库

    经常玩服务器上的mysql数据库,但是基于linux操作Mysql多有不便,于是就想着使用GUI工具来远程操作mysql数据库.已经不是三次使用navicat-for-mysql了,但是每次连接远程服 ...

  8. C#基础随手笔记之基础操作优化

    对数据的查询,删除等基本操作是任何编程语言都会涉及到的基础,因此,研究了一下C#中比较常用的数据操作类型,并顺手做个笔记. List查询时,若是处理比较大的数据则使用HashSet<T>类 ...

  9. DPDK virtio-user

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. virtio-user 是 DPDK 针对特定场景提出的一种解决方案, ...

  10. CALayer简介

    一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...