在index.js中一开始就对文件是否存在做了判断,在filesLoad函数中同样做了一次判断。重写之后如下
// server.js
var config = require('./common/config');
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var FServer = require('./server/FServer');
function index(){
function onRequest(req, res){
// 取得文件路径
var pathname = url.parse(req.url).pathname;
// 获取文件扩展名(包含前置.)
var extname = path.extname( pathname );
var type = extname.slice(1);
// 获取下载文件在磁盘上的路径,
var realPath = config.root + pathname;
if ( extname ) {
if ( type === 'html' ) {
realPath = config.root + '/tpl' + pathname;
}
FServer.filesLoad(realPath, type, req, res);
} else {
// ToDo
}
}
http.createServer(onRequest).listen(config.port);
}
exports.index = index;
代码相比之前要简洁的多,然而 ToDo 部分并没有添加实质内容。只是因为没有确定扩展名时,不确定请求的是什么类容,因此不能确定文件在磁盘上的真实路径。一般来说对于没有扩展名的请求都具有数据操作的属性(不包括为了SEO而重写的url)。要完成ToDo的内容一个可行的方法是把网站所有的url列举,让请求与磁盘上的文件一一对应起来。例如
file = {
'/' : config.root + '/tpl/index.html',
'/upload' : config.root + '/tpl/upload.html'
// 其他
}
如此要去的文件在磁盘上的真实路径就可以调用 file[pathname], ToDo的内容可以转变为:
realpath = file[pathname];
type = path.extname( realpath );
FServer.filesLoad(realPath, type, req, res);
如果对应的请求需要操作数据,那么这种方法就不好使了。至于如何请求数据且听下回分解。