2016-10-26 60 views
0

我跟隨Bucky新波士頓的教程,似乎無法讓圖像顯示在節點中運行簡單靜態索引頁的HTML文件中。 jsnode.js簡單的HTTP服務器,內容html不顯示圖像

請注意:這是一個學校項目,我負責這樣做而不使用我們尚未達成的express或connect等中間件。 :d

var http = require('http'); 
var fs = require('fs'); 
var accessTime = new Date(); 
var accessCount = 0; 


function send404Response(response) { 
    response.writeHead(404, {"Content-Type": "text/plain"}); 
    response.write("Error 404: Page not found!"); 
    response.end(); 
} 


function onRequest(request, response) { 

    if (request.method == 'GET' && request.url == '/'){ 

     response.writeHead(200, {"Content-Type": "text/html"}); 
     fs.createReadStream("./index.html").pipe(response); 

     fs.writeFileSync("logfile.txt", "\n Someone has accessed the index page \n" + accessTime + "\n ", "UTF-8",{'flags': 'a'}); 
     console.log("A user made a request"); 

     accessCount += 1; 
     console.log(accessCount + " page requests so far . . ."); 


    }else { 
     send404Response(response); 
    } 

} 

http.createServer(onRequest).listen(8888); 
console.log("Server is running..."); 

當我運行它,在HTML頁面加載罰款爲localhost:8888,但沒有圖像會顯示出來,除非我使用外部圖像。例如,HTML只會有標準的圖像標籤?

<img src='photo.jpg' .... /> // doesnt work 
<img src='http://www.AWebSite.com/photo.jpg' .... /> // naturally works 

謝謝!!

+0

再看看你的'onRequest'函數,並檢查請求是什麼樣的。做一個'console.log(request)'。你會看到有幾個請求,只有一個滿足'如果陳述'... –

回答

0

對,所以目前你沒有提供圖像的代碼路徑。你的第一個代碼塊對'http://localhost:8888/'做出響應,而沒有其他的;如果有人要求,你甚至不會提供'http://localhost:8888/index.html'。

如果你想提供所有的靜態內容,那麼有幾種方法可以解決它。要成爲最類似於Web服務器的服務器,您可能需要在靜態資產中包含一個已知文件夾(例如./public)。然後,您只需要採取request.url並在fs.stat()的公共路徑下查找。如果該路徑存在於該位置,那麼您應該檢查文件擴展名以找出Content-Type標頭並像現在一樣提供它。如果沒有,那麼你會像你現在正在做的那樣返回一個404。

如果你根本不被允許使用第三方庫,我還建議將每個邏輯位分塊到你自己需要的文件中。如果你可以使用第三方庫(不是中間件),那麼我會說看看async.js來幫助文件處理工作流程,並避免回調地獄。

+1

謝謝你的出色答案。我能夠根據你的建議的一部分來解決它。如果請求方法是images/jpg,那麼我使用另一個方法來提供圖像。這不是你生產系統最合適的方式,但符合要求。我相信他一直在尋找我們,理解每件物品都必須經過檢查,然後作出迴應。乾杯! – loganpixel

+0

很高興幫助!與班上其他同學祝好運 – Paul