2013-08-01 134 views
1

當我做fs.readFile(file...我得到這個錯誤:Node.js的不正確的路徑問題

{ [Error: ENOENT, open 'foundation/css/normalize.css']

errno: 34,

code: 'ENOENT',

path: 'foundation/css/normalize.css' }

我一定要我的路線相對於它們從鏈接的HTML文件的路徑,或相對於位置運行服務器和路由器的nod​​e.js文件?

不,我不使用快遞和「使用快遞」不是一個可以接受的答案。


編輯

@ BenjaminGruenbaum的最後意見。我不確定你的HTTP響應是什麼意思,但是我的代碼邏輯如下所示:我通過URI加載我的index.html,然後在文件readFile中遞歸地遍歷每個其他鏈接文件。我有一個腳本將其分解,以正確顯示正確的Content-Type

function route(handle, pathname, response, request){ 
// console.log("About to route a request for " + pathname); 

if (typeof handle[pathname] === "function"){   
    handle[pathname](response, request); 
    } else { 

    // console.log('NON HTML'); 
    // console.log(pathname); 

    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;  
    // console.log('URL REQUEST'); 
    // console.log(url_request); 

    // 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)); 
    // console.log('EXTENSION'); 
    // console.log(extension); 


    //set path of static pages 
    if (extension === 'css' || extension === 'js' || extension === 'htm' || extension === 'html' || extension === 'png' || extension === 'jpg' || extension === 'jpeg'){ 

     // console.log('LOAD STATIC PAGE'); 
     file_path = url_request.replace("/", ""); 
     // console.log(file_path); 
     // console.log(); 
    } 

    //load needed pages and static files 
    fs.readFile(file_path, function (error, data){ 
     if(error){ 
      // console.log("AM I DEAD"); 

      // console.log(error); 
      // console.log(); 
      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]}); 

      console.log('SHOULD BE SUCCESS') 
      console.log(mimes[extension]); 
      // console.log(data); 
      response.write(data); 
     } 

     response.end(); 
    }); 
    response.end(); 
} 
} 

exports.route = route; 

你可以通過我多少地方有console.log()告訴我可以跟蹤所有的方式向底部的它失敗在這裏:因爲它太長了評論,我會在這裏包括它

else{ 
      response.writeHeader(200, {"Content-Type": mimes[extension]}); 

      console.log('SHOULD BE SUCCESS') 
      console.log(mimes[extension]); 
      // console.log(data); 
      response.write(data); 
     } 

對於有點草率的縮進,我表示歉意。


最後編輯:

的最終解決這個愚蠢的情況可以在我的以下問題在這裏找到:Node.js - Resource interpreted as Script but transferred with MIME type text/plain

很大程度上得益於@BenjaminGruenbaum的忍受一個小白

回答

2

你將不得不使用相對於你的NodeJS文件的路徑(更具體地說是入口點),而不是你的客戶端HTML。

這就好像它在Python中的bash腳本中工作一樣,並且在任何其他語言中都有一個理智的API,可以對操作系統中的本地文件系統函數進行合理的調用。事實上,客戶端HTML與Node中的路徑無關 - 在Node的立場中,它只是將文本發送給客戶端的HTTP響應。它根本不知道服務器的內部文件系統。

(另外,我看不出有什麼特別的東西可以幫助反正)

+0

謝謝。給我5分鐘,我會試一試。我只是把它放在表達式中,因爲這往往是對任何節點問題的最經常回應。它錯了我的地獄 – JDillon522

+0

我給了它一個旋轉,它沒有工作。我不知道如何用文本表達,但我的文件結構如下:'main_folder/assets/foundation + images + JS'我的節點文件位於JS文件夾中。所以我有我的基礎文件的路徑爲'../ foundation/css/normalize.css'但它仍然不起作用 – JDillon522

+1

讓我們來隔離這個。創建一個名爲server.js的新文件,在同一目錄下創建一個名爲'README'的文件並在其中寫入「Hello World」。所有server.js都在README中調用fs.readFile。現在玩路徑,做'../ dirname/README' - 仍然有效。現在嘗試將自述文件放入新目錄中,然後查看路徑仍然有效。 (順便說一句,我只是在我的盒子裏證實了這一切)。現在,你確信問題不在路徑上試着調試它 - 在終端上打印控制檯日誌並在終端中手動打開它,拼寫錯誤發生在我身上數十次:) –