服务器返回任意页功能
这一节,要进一步扩展,通过设置指定一个静态资源目录,让浏览器可以访问任意该目录内的任意文件。
(小帅哥问:我们怎么知道浏览器要访问什么文件?)
这个问题问的很好! 前几节我们知道有个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.txt和b.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 的雏形。