node . js创建HTTP文件服务器的使用示例

  

HelloWorld示例只有演示意义,这次我们来搞一个实际的例子:文件服务器。我们使用node . js创建一个HTTP协议的文件服务器,你可以使用浏览器或其它下载工具到文件服务器上下载文件。

  

为了读取文件,我们会用到文件系统模块(名字是“fs”),流,我们还要分析URL,区别HTTP方法,还会用到EventEmitter。

  

  

先上代码吧,依然是简单的:

     //引入http模块   var http=要求(“http”);   var fs=要求(fs);//创建服务器,指定处理客户端请求的函数   http.createServer (   函数(请求、响应){//判断HTTP方法,只处理   如果请求。方法!=暗玫健?{   response.writeHead (403);   response.end ();   返回null;   }//此处也可使用URL模块来分析URL (https://nodejs.org/api/url.html)   9月var=request.url.indexOf (' & # 63; ');   var filePath=9月& lt;0 & # 63;请求。url: request.url。片(0、9月);   控制台。日志(“文件:”+ filePath);//当文件存在时发送数据给客户端,否则404   var fileStat=fs.stat (+ filePath“。”,   函数(呃,统计){   如果(err) {   response.writeHead (404);   response.end ();   返回null;   }//TODO:内容类型应该根据文件类型设置   响应。writeHead(200年,{“内容类型”:“text/plain”,“内容长度”:stats.size});//使用流   var流=fs.createReadStream (“。”+ filePath);      stream.on(“数据”,函数(块){   response.write(块);   });      stream.on(“结束”,函数(){   response.end ();   });      stream.on(“错误”,函数(){   response.end ();   });   }   );   }   ).listen (8000);      控制台。日志(“Hello World开始听>   fs。stat(路径,回调)      

第一个参数是文件路径,第二个参数是回调函数.fs.stat()方法是异步的,结果通过回调函数调返回.callback的原型如下:

        函数(呃,统计)      

第一个参数指示是否出现了错误,第二个参数是一个对象,类型是fs.Stats,保存了文件的状态信息,比如大小,创建时间,修改时间等。

  

服务器的代码获取到文件状态后,读取大小,调用http.ServerResponse的writeHead方法,设置HTTP状态码为200,还设置了内容长度头部。代码如下:

  

代码如下:响应。writeHead(200年,{“内容类型”:“text/plain”,“内容长度”:stats.size})
  

  

  

接下来呢,我们调用fs.createReadStream创建了一个ReadStream对象.ReadStream是流,也是EventEmitter。

  

fs.createReadStream方法原型如下:

        fs。createReadStream(路径[选项])      

第一个参数是文件路径,第二个参数是可选的JSON对象,用来指定打开文件的一些选项,默认值如下:

        {国旗:‘r’,   编码:空,   fd:空,   模式:0666年,   autoClose:真   }      

autoClose属性默认为真实,读完文件或读取出错时,文件会被自动关闭.fd属性可以关联一个已有的文件描述符,这样就会忽略路径,根据一个已经打开的文件来创建流.options还可以有开始和结束项指定起、止位置,读取文件的特定区域。如果我们要实现断点续传,就需要这个了,用法类似这样:

        fs.createReadStream(“样本。mp4,{: 1000年开始,结束:10000});      

编码用来指定文件的编码,这对于文本文件有特殊的意义,目前支持“use utf8”、“ascii”和“base64”。

  

ReadStream读取数据是异步的,一块一块的读,读到一部分就发送一个数据事件,数据呢,会传递给与事件关联的侦听器(实际上是一个回调方法)。在我们的代码里,仅仅是调用response.write把数据写给客户端。注意,可能会多次调用response.write哦。又因为我们设置了内容长度,所以不会采用分块编码方式。如果我们不设置内容长度,那默认会启用分块方式。

  

ReadStream读完文件时会发射结束事件,出错时会发射错误事件,我们监听这两个事件,简单的终止响应。

  

我们在示例代码中看到了stream.on这种代码,下面来解释吧。

  

  

node . js基于V8引擎实现的事件驱动IO,是其最大最棒的特色之一。有了事件机制,就可以充分利用异步IO突破单线程编程模型的性能瓶颈,使得用JavaScript作后端开发有了实际意义。

  

<强> EventEmitter的基本用法

node . js创建HTTP文件服务器的使用示例