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