用Node.js写了一个静态文件服务器[100行,2K]

c2u 2012-03-13 09:17:38
接触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后在命令行输入:


node FileServer.js E:\ 8021


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

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


node FileServer.js E:\ 8021 true


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



代码分析: JS源码


//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。


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


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


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
...全文
353 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp42a 2012-06-12
  • 打赏
  • 举报
回复
微软很早就在ASP中支持了JScript,但JSctrip并不包含prototype继承和闭包这两大核心内容。

后来的 JScript 可以支持了。
plzzz 2012-03-14
  • 打赏
  • 举报
回复
node.js 一直没什么时间看了..也不知目前哪个版本了
c2u 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zswang 的回复:]

写得还可以,不过理实用还有一定距离

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

举个栗子:“http://localhost:8021/../”这样将超出你的预期,访问了共享的上级目录,存在安全隐患。
[/Quote]

没想着实用,就是写着玩的,
异步:本来第一个版本是异步的,不过这样写出的代码会产生很多的闭包嵌套,代码有点不好看,而且做全目录递归的时候处理起来有些复杂,有时间会改成异步的,但可能不支持全目录浏览模式。
安全性:http://localhost:8021/../ : Winodws下测试过,没有发现有这个问题。
缓存过于复杂,以后可能会在全目录模式下加进去。
xuzuning 2012-03-14
  • 打赏
  • 举报
回复
有点意思
王集鹄 2012-03-14
  • 打赏
  • 举报
回复
写得还可以,不过理实用还有一定距离

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

举个栗子:“http://localhost:8021/../”这样将超出你的预期,访问了共享的上级目录,存在安全隐患。
Acesidonu 2012-03-13
  • 打赏
  • 举报
回复
非常不错

87,989

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧