接触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

解决方案 »

  1.   

    node.js 一直没什么时间看了..也不知目前哪个版本了
      

  2.   

    写得还可以,不过理实用还有一定距离比如异步处理、缓存处理、安全性。举个栗子:“http://localhost:8021/../”这样将超出你的预期,访问了共享的上级目录,存在安全隐患。
      

  3.   


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

  4.   

    微软很早就在ASP中支持了JScript,但JSctrip并不包含prototype继承和闭包这两大核心内容。后来的 JScript 可以支持了。