2012-04-16 110 views
1

我有這樣的代碼(https://gist.github.com/2402116):提供HTML文件,fs.readFileSync()失敗

server.get('/', function(request, response) { 
var k = fs.readFileSync('./index.html','utf8'); 
response.send(k); 
}); 

嘗試讀取這個文件:

https://gist.github.com/2402070

和瀏覽器保持裝載和永不結束。

但是,如果我刪除所有js包括從html文件工作正常。

我做錯了什麼?

+0

你的「app.js」文件是做什麼用的?看起來你已經縮小到了代碼中的某些東西,不是嗎? – maerics 2012-04-16 22:55:07

+0

app.js擁有所有的前端邏輯。我認爲它在編碼嘗試將文件數據發送到瀏覽器時與編碼有關。 – escusado 2012-04-16 22:57:15

+0

您可以在瀏覽器的開發人員工具中使用概要分析工具來查看它被抓到的位置 - 腳本執行,網絡,渲染等。 – jimw 2012-04-16 22:58:32

回答

2

current server implementation不會做任何事情但服務index.html要求的基地址,即'/'。您需要編寫進一步的代碼/路線以服務於您在index.html中包含的js的請求,即'/app.js'以及'/js/'中的各種js文件。

現在,要點中的路由實現相當粗糙,不支持url匹配的很多方面。原始代碼顯然只是爲沒有資源的單個頁面網站展示一個概念。你會發現它會很快讓你的代碼工作變得很麻煩,因爲你將不得不爲每個資源請求寫一個路由,例如

server.get('/app.js', function(request, response) { 
    var k = fs.readFileSync('./app.js','utf8'); 
    response.send(k); 
}); 

server.get('/js/jquery-1.7.2.js', function(request, response) { 
    var k = fs.readFileSync('./js/jquery-1.7.2.js','utf8'); 
    response.send(k); 
}); 

etc... 

你最好在Node.js的URL路由庫尋找已經在那裏(例如director)或Web框架如express這對於routing內置支持(和靜態文件服務)。

1

一旦完成向瀏覽器發送數據,您需要一個response.end()

實際上,由於您一次發送所有數據,因此您可以用response.end(k)替換response.send(k)。儘管不推薦這種方法。我強烈建議異步讀取您的文件,並逐塊發送給客戶端。

參見:http://nodejs.org/api/http.html#http_response_end_data_encoding

+0

如果您看第一個gist'send'是一個包含'end()'的自定義實現。 – 2012-04-16 23:02:45

1

嘗試日k .toString,不發送,但.end

response.end(k.toString()); 

也許有些奇怪的事情發生了,他試圖EVAL代碼