2016-02-27 539 views
0

我剛剛開始閱讀使用Node和Express的Web開發,並且遇到了本書中未回答的問題。他們給出了一個基本的佈局,允許服務器請求home,​​和/404。每個人都有自己的HTML文件,其中有一張圖片。服務器路徑的流

這裏是他們給的代碼:

var http = require('http'); 
var fs = require('fs'); 
function serveStaticFile(res, path, contentType, responseCode){ 
    if(!responseCode) responseCode = 200; 
    fs.readFile(__dirname + path, function(err, data){ 
     if(err){ 
      res.writeHead(500, {'Content-Type':'text/plain'}); 
      res.end('500 - Internal Error'); 
     } else { 
      res.writeHead(responseCode, {'Content-Type':contentType}); 
      res.end(data); 
     } 
    }); 
} 

http.createServer(function(req, res){ 
    //normalize url by removing querystring, optional 
    //trailing slash, and making it lowercase 
    var path = req.url.replace(/\/?(?:\?.*)?$/,'').toLowerCase(); 
    switch(path){ 
     case '': 
      console.log('1'); 
      serveStaticFile(res, '/public/home.html', 'text/html'); 
      break; 
     case '/about': 
      console.log('2'); 
      serveStaticFile(res, '/public/about.html', 'text/html'); 
      break; 
     case '/img/error.jpeg': 
      console.log('3'); 
      serveStaticFile(res, '/public/img/error.jpeg', 'image/jpeg'); 
      break; 
     case '/img/logo.jpeg': 
      console.log('4'); 
      serveStaticFile(res, '/public/img/logo.jpeg', 'image/jpeg'); 
      break; 
     default: 
      console.log('5'); 
      serveStaticFile(res, '/public/404.html', 'text/html'); 
      break; 
    } 
}).listen(8080); 
console.log('Server started on localhost:8080'); 

homeabout,並404每個HTML文件中都有自己的<img>標籤,所以我想的圖像會在用戶請求一個URL自動呈現。我們如何在switch中需要額外的案例來處理圖像?例如,如果我輸入http://localhost:8080/about,它將記錄2,然後4。爲什麼about的情況也稱爲'/img/logo.jpeg'

回答

1

這是因爲圖像是由瀏覽器分別從html,js文件,css文件請求的。

每個靜態資源都由瀏覽器在單獨的http請求中獲取。如果一個html頁面需要5個javascript文件,3個css文件,4個圖像,瀏覽器將發出5 + 3 + 4 + 1 = 13個請求。

+0

有趣,謝謝你的簡單回答! – MarksCode

1

'/about'案例日誌2並呈現靜態文件'/public/about.html'。我敢打賭,'/public/about.html'頁面包含一個圖像標記,如<img src="/public/img/logo.jpeg">。這將打擊服務器的網址'/public/img/logo.jpeg',並登錄4.

因此,你的case語句正確地打破;這只是您可能向服務器發出兩個請求:一個用於關於頁面,另一個用於標識圖像。

+0

這讓人很有道理,謝謝你! – MarksCode

1

我也讀過這本書。你提到的代碼在第2章中,更多的是一種笨拙的路由方式。在接下來的章節中,作者繼續討論Express如何使路由變得容易。

要回答你的問題,你不需要switch語句中的路由或API來處理圖像。只要路徑位於客戶端返回或構建的HTML中,圖像就會自動下載。

+0

是的,我正在寫第3章,我只是想了解基本知識,然後才轉到 – MarksCode