2013-08-01 39 views
0

因此,我正在學習node.js,並且我可以成功地將它路由到新的HTML頁面並顯示基本文本。但是,當我嘗試添加任何其他JavaScript,CSS或甚至圖像時,它會將它們視爲加載整個HTML文件。瞭解Node.js如何加載頁面

的代碼是太長,真正張貼所以我會分享我的console.log輸出:

  • 請求/開始接收。
  • 關於路由請求/開始
  • 調用請求處理程序「開始」。
  • 收到請求/socket.io/lib/socket.io.js。
  • 關於路由的/socket.io/lib/socket.io.js請求
  • 沒有請求處理程序發現/socket.io/lib/socket.io.js
  • 請求/style.css接收。
  • 關於路由的/style.css
  • 沒有請求處理的請求發現/style.css
  • 請求收到/test.jpg。
  • 關於路由的/test.jpg
  • 沒有請求處理的請求發現/test.jpg
  • 請求收到/favicon.ico。
  • 關於路由的/favicon.ico
  • 的請求沒有請求處理程序發現/favicon.ico

我整明白favicon.ico一塌糊塗,但我不知道爲什麼它對待其他文件它的方式。

當用Node.js加載頁面時,我需要做什麼/考慮什麼?

+1

你的問題是完全無法回答的,因爲這與Node.js完全沒有關係,並且與你在Node.js上使用的任何框架處理HTTP請求有關。你在用什麼?表現?你自己的代碼?我也不清楚問題是什麼。 – Brad

+0

我現在沒有使用Express。在進一步觀察它之後,這是我的理論:當我做'fs.readFile'並閱讀index.html時,它會通過並通知我的CSS或JS文件的鏈接。然後它讀取這些文件,並且由於「Content-Type:」設置爲「text/html」,它不會正確讀取這些文件。因此不顯示它。它必須是'text/css'什麼的。 – JDillon522

+1

你一定要添加一個[SSCCE](http://sscce.org) – Zeta

回答

2

您必須記住,node.js不是默認情況下爲webroot目錄中的文件提供服務的Web服務器。它是一個低級別的應用程序,它有一個API來提供網絡和http請求。雖然express.js公開了一個公用文件夾,您可以在其中放置資源,但它會使用大致相同的方法提取文件並回復請求。

Node.js未完全優化以處理HTTP上的服務文件。大多數人在生產上做的是安裝一個反向代理(nginx是一種流行的選擇),以便路由請求。您可以指示nginx在web根目錄中找到該文件,否則將請求重定向到node.js.

+0

哎。我有很多要學習的。謝謝你的好輸入,儘管 – JDillon522

+0

@ JDillon522沒問題。這樣學習並不多。將nginx設置爲節點的反向代理就像目前的標準設置,因此谷歌搜索會向您顯示一些有用的結果。除此之外,你只需要記住節點是低級應用程序。例如,我會說有更少的事情要學習和記住,比在軌道上的紅寶石。 – Munim

0

那麼,對於那些相當不熟悉的人來說,這裏是使用Express顯示大多數常見文件類型而不使用的一種方法。

var file_path = ""; 
    var mimes = { 
     'css': 'text/css', 
     'js': 'text/javascript', 
     'htm': 'text/html', 
     'html': 'text/html', 
     'png': 'image/png', 
     'jpg': 'image/jpg', 
     'jpeg': 'image/jpeg' 
    }; 

    // parses the url request for a file and pulls the pathname 
    var url_request = url.parse(request.url).pathname;  
    // finds the placement of '.' to determine the extension     
    var tmp = url_request.lastIndexOf("."); 
    // determines the extension by uing .substring that takes everything after '.' 
    var extension = url_request.substring((tmp + 1)); 

    //set path of static pages 
    if (extension === 'css' || extension === 'js' || extension === 'htm' || extension === 'html' || extension === 'png' || extension === 'jpg' || extension === 'jpeg'){ 
     file_path = url_request.replace("/", ""); 
    } 

    //load needed pages and static files 
    fs.readFile(file_path, function (error, data){ 
     if(error){ 
      response.writeHeader(500, {"Content-Type": "text/html"}); 
      response.write("<h1>FS READ FILE ERROR: Internal Server Error!</h1>");  
     } 
     else{ 
      response.writeHeader(200, {"Content-Type": mimes[extension]}); 
      response.write(data); 
     } 

     response.end(); 
    }); 

我想知道更簡潔的方式做到這一點,而不使用Express。