服务器返回任意页功能

这一节,要进一步扩展,通过设置指定一个静态资源目录,让浏览器可以访问任意该目录内的任意文件。

(小帅哥问:我们怎么知道浏览器要访问什么文件?)

这个问题问的很好! 前几节我们知道有个request请求对象,这个对象是只读的,这个对象内就包含了要请求那个文件的信息。

但这个信息体现形式是网址形式,如何解释网址,是由服务器端程序来做的,而我们要做的就是解释网址信息的工作。

这个网址信息通过 request.url 就可得到,而这个网址信息还需要过滤一下。比如 url是 /A/B?ccsds,我们真正想要的是 /A/B,再比如/A/B/book.html?id=001,我们真正想要的是/A/B/book.html

url的解析要用到URL模块,通过var url  = require("url")可以得到该模块对象。下面先开发一个把url转换成路径的工具函数。

var url = require("url");

// 把URL转换成资源路径
function url2path(url_str){
    var urlObj = url.parse(url_str);  // 把url信息封装成JSON对象
    var path = urlObj.path;  // 得到路径信息
    return path;
}

接下来把功能整合起来,修改handle函数让他具备静态服务器功能。 

function handle(request,response){
       function callback(err,data){
             response.write(data);
             response.end();       
       }
       var path = url2path(request.url); // 得到path
       var data = fs.readFile(__dirname+"/public"+path,callback);   // 这里指定public是静态资源目录
}

下面为了测试需要,要在public目录下再建立两个文件,一个是a.txtb.html


看下面视频演示效果


(小胖突然想到什么似的,问道:那如果文件不存在怎么办?)

这个问题就是马上要修补的功能,现在的程序如果找不到文件,服务器端就会出错,看一下之前介绍的 callback(err,data)回调函数 ,这个函数会接收到两个参数,err表示错误,data表示读取到的数据,如果读取不到数据或内部出错,err就会存在 。

所以可以把callback加固一下,通过判断err是否存在,如果存在就通知浏览器客户端404代码,404表示不存在资源。

function callback(err,data){
      if(err){
           response.statusCode = 404;  // 设置状态码,表示没找到资源。
      }else{
           response.write(data);
      }
      response.end();       
}

这样,当客户端访问的资源不存在时,就不会让服务器崩溃,而浏览器接收到404就知道资源不存在,展示给客户一个不存在的提示页面。


本节实现了在服务器端,指定一个public静态服务器目录,从而让客户端访问该目录和子目录下的全部文件,当没有文件时,响应404未找到资源编码。

下一节,整合一下,形成一个模块,该模块将是 stuwebfk 的雏形。