在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);
如果對應的請求需要操作數據,那麼這種方法就不好使了。至於如何請求數據且聽下回分解。