用节点提供静态文件服务的方法

  


  

  

对于一个网络应用,提供静态文件(CSS、JavaScript图片)服务常常是必须的。本文将介绍如何做一个自己的静态文件服务器。

  


  

  

每个静态文件服务器都有个<代码>根目录>         var http=要求(“http”)   var加入=要求(“路径”). join   var fs=要求(fs)      var=__dirname根      之前      

__dirname在节点中是一个神奇的变量,它的值是该文件所在目录的路径。在本例中,服务器会将这个脚本所在的目录作为静态文件的根目录。

  

有了文件的路径,还需要传输文件的内容。
  

  

这可以用<代码> fs。ReadStream>   

  

下面的代码实现了一个简单但功能完备的文件服务器。

        var=http服务器。res createServer(函数(点播){   让道路=加入(根,req.url)   让流=fs.createReadStream(路径)   流。(“数据”,函数(块){   res.write(块)   })   流。(“结束”,函数(){   res.end ()   })   })      server.listen (3000)      之前      

这个文件服务器大体能用,但还有很多细节需要考虑。接下来我们要优化数据的传输,同时也精简一下服务器的代码。

  


  

  

虽然上面的代码看上去还不错,但节点还提供了更高级的实现机制:<代码> Stream.pipe()。用这个方法可以极大简化服务器的代码。优化后代码如下:

        var=http服务器。res createServer(函数(点播){   让道路=加入(根,req.url)   让流=fs.createReadStream(路径)   stream.pipe (res)   })      server.listen (3000)      之前      

这种写法,是不是更简单,更清晰了呢?

  


  

  

流是节点中很重要的一个概念,你可以把节点中的管道想象成水管,如果你想让某个源头(比如热水器)流出来的水流到一个目的地(比如厨房的水龙头),可以在中间加一个管道把它们连起来,这样水就会顺着管道从源头流到目的地。
  

  

节点中的管道也是这样,但其中流动的不是水,而是来自源头(即ReadableStream)的数据,管道可以让它们“流”动到某个目的地(即WritableStream)。你可以用管方法把管道连起来:

        ReadableStream.pipe (WritableStream)      

读取一个文件(ReadableStream)并把其中的内容写到另一个文件中(WritableStream)用的就是管道:

        让readStream=fs.createReadStream (“。/original.txt”)   让writeStream=fs.createWriteStream (“。/copy.txt”)   readStream.pipe (writeStream)      

所有ReadableStream都能接入任何一个WritableStream。比如HTTP请求(点播)对象就是ReadableStream,你可以让其中的内容流动到文件中:

        req.pipe (fs.createWriteStream (’。/req-body.txt '))      


  

  

现在我们来运行上面的代码,我们在根目录下放一张图片,比如peiqi.jpg。
  

  

在浏览器中输入http://127.0.0.1:3000 peiqi.jpg,发现可爱的peiqi已经出现在你的面前了.peiqi.jpg被当作响应主体从http服务器送到了客户端(浏览器)。
  

  

用节点提供静态文件服务的方法

  

虽然已经品尝到了成功的滋味,但这个静态文件服务器还不够完整,因为它很容易出错。想象一下,如果用户不小心输入了一个并不存在的资源,比如abc.html,服务器就会马上崩掉,所以我们还得给这个文件服务器加上错误处理机制,让它足够健壮。

  

  

在节点中,所有继承了EventEmitter的类都可能会发出错误事件。为了监听错误,在fs.ReadStream上注册一个错误事件处理器(比如下面这段代码),返回响应状态码500表明有服务器内部错误:

        流。(“错误”,函数(err) {   res.statusCode=500   res.end(“服务器内部错误的)   })   之前      


  

用节点提供静态文件服务的方法