日期:2014-05-16  浏览次数:20331 次

用Node.js写了一个静态文件服务器[100行,2K]
接触Node.js有段时间了,估计跟大多数Web开发者一样,对Node.js有种自来熟的感觉。

其实Node.js并不是第一个把JavaScript应用到服到服务端的,微软很早就在ASP中支持了JScript,但JSctrip并不包含prototype继承和闭包这两大核心内容。

NodeJS与PHP一样是脚本语言,直接由C/C++编写的编绎器解释执行,性能上比任何需要虚拟机托管执行的高级语言都要快。不过个人感觉其单线程,事件驱动的特性并不太适合架设较为复杂的Web服务器,因为一但遭遇异常,服务就会中止,以后Tomcat可能会支持Node.JS,为每一个请求新建一个Node进程,增强其健壮性。
NodeJS因为其JS的语法特点所以拥有非常高的产出效率(语法简洁,{}即对象,[]即数组,虽然C#也引入了许多动态语言的特性如var/dynamic, 兰布达表示等,但在开发效率上比JS还稍差一些),而且Node绝对不会被过渡设计,因而性能是有保障的。

总之个人认为Node.JS大有可能挑战php目前在Web架构中的统治地位(超过77%的网站、Alex排名靠前网站大多基于PHP)。

下面是本人编写的一个简单静态文件服务器,除掉注释100行左右,调用非常简单,安装好Node.JS后在命令行输入:

JScript code

node FileServer.js E:\ 8021



"E:\" 是需要浏览的目录(尚不支持带有空格的目录,Node框架会把空格当成变量分隔符,目前没有做特殊处理),8021是侦听的端口。

这里还支持第三个参数,即是否开启全目录浏览,默认是关闭的,注意这种模式只适合浏览文件较少的目录。

JScript code

node FileServer.js E:\ 8021 true



运行完以后,可以直接在浏览器输入网址浏览结果: http://localhost:8021



代码分析: JS源码 

JScript code

//FileServer Namespace
var FileServer;

(function(){
    var fs = require("fs"),
        path = require("path");

    var server = FileServer = {
        //Root path
        dir: "C:\\Program Files",



从以上代码可以看出,JS是完全面向对象的,这里引用了Node.JS的全局对象fs和path。

JScript code

var fileServer = Object.create(FileServer);
fileServer.init(process.argv[2], process.argv[3], process.argv[4]);



Object.create来自自ECMAScript5,这样FilerServer即可以作为单例来使用,又可以使用对象来继承,使用起来非常灵活。关于更多的ECMAScript5的用法可以参数我的另一篇博文: ECMAScript 5 用法

JScript code

try{
    stat = fs.statSync(fullPath)
}catch(err){
    server.response.writeHead(404, {"Content-Type": "text/html"});
    server.write("File not found!", err);
    return;
}



因为同步处理的代码写起来比较简单,所以这里使用的都是Sync模式,但这种模式会抛出异常,所以有几处使用了try{}catch{}代码块。

这个只是初稿,可能会有很多BUG,如果有时间的话会继续完善。源代码大家可以去这下下载: https://github.com/newghost/FileServer-Node.js

------解决方案--------------------
非常不错
------解决方案--------------------
node.js 一直没什么时间看了..也不知目前哪个版本了
------解决方案--------------------
写得还可以,不过理实用还有一定距离

比如异步处理、缓存处理、安全性。

举个栗子:“http://localhost:8021/../”这样将超出你的预期,访问了共享的上级目录,存在安全隐患。
------解决方案--------------------
有点意思