先做一下簡單的概念驗證,看看與檔案系統對應是否可行。
從hello world開始
再提一下最簡單的hello world:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8443, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
要讓他可以支援跟檔案系統對應好的資源,可行的方法大概是:
加上檔案系統對應實作
先看一下程式(evolve.js):
var http = require('http'),
fs = require('fs'),//利用FileSystem模組來讀取檔案
url = require('url'),//利用url模組來剖析url
baseDir = __dirname + '/../www',//設定檔案系統對應的根目錄
server = http.createServer(function(request, response) {
var urlObj = url.parse(request.url);//剖析url
var respath = baseDir + (urlObj.pathname.indexOf('/')===0? urlObj.pathname:'/'+urlObj.pathname);
//組出資源的路徑
fs.readFile(respath, function(err, data) {//讀取資源
if(err) {//發生錯誤,回傳http status 404
console.log(respath + ' not exists.');
response.writeHead(404, '');
response.end();
} else {//正確,回傳檔案內容
console.log(respath + ' exists.');
response.writeHead(200, {
"Content-Type": 'text/html',
"Content-Length": data.length
});
response.end(data);
}
});
});
server.listen(8443, '127.0.0.1');
console.log('server started.');
(也沒加幾行程式)
在'../www'目錄裡面,放置了index.html檔案,內容非常簡單:
this is index.html
目前有兩個檔案,用這樣的目錄結構來放置:
.
├── lib
│ └── evolve.js
└── www
└── index.html
執行的時候,就用node lib/evolve.js
來執行,看到出現'server started.'的訊息,應該就正常啓動了。
接下來可以進瀏覽器,在網址列輸入:http://127.0.0.1:8443/index.html ,看到出現'this is index.html',就表示它正常運行了。
隨便打一下其它資源看看:http://127.0.0.1:8443/bg.gif ...這樣就跑不出結果。另外,從console也可以看到某個資源路徑exists或是not exists的訊息。
這個概念驗證其實寫的很糟糕,所有的東西都是寫死的。而且要讓伺服器回傳各類內容時,會碰到一個問題:我要怎麼依照各種資源的檔案類型提供適當的Content-Type header給瀏覽器?缺乏這個header資訊,瀏覽器很難處理伺服器傳過來的內容。要解決這個問題,這個伺服器才能真正拿來使用。這個問題......我們留到明天再解決