iT邦幫忙

DAY 6
5

node.js伺服器實戰系列 第 6

node.js伺服器實戰(6) - 初步概念驗證

先做一下簡單的概念驗證,看看與檔案系統對應是否可行。
從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/');

要讓他可以支援跟檔案系統對應好的資源,可行的方法大概是:

  1. 需要指定一個目錄作為對應的根目錄
  2. 需要從ServerRequest物件取得請求資源的路徑
  3. 把根目錄與資源路徑組合起來,成為完整的路徑
  4. 在檔案系統中找尋是否存在這個資源,如果有,則寫入ServerResponse回傳給客戶端。如果沒有,則回傳http status 404。

加上檔案系統對應實作

先看一下程式(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.');

(也沒加幾行程式XD

在'../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資訊,瀏覽器很難處理伺服器傳過來的內容。要解決這個問題,這個伺服器才能真正拿來使用。這個問題......我們留到明天再解決XD

相關文章


上一篇
node.js伺服器實戰(5) - 計畫與範圍
下一篇
node.js伺服器實戰(7) - mime支援
系列文
node.js伺服器實戰33

1 則留言

0
chiounan
iT邦研究生 1 級 ‧ 2011-10-17 10:01:30

筆記用功,用功。

我要留言

立即登入留言