2013-07-11 29 views
18

以下代碼向瀏覽器輸出index.html的內容(它只包含文本hello world)。但是,當我用readFileSync替換readFile時,請求超時。我錯過了什麼?是否需要另一種緩衝區?我使用節點0.61和2.4表示readFile和readFileSync之間的區別

var express = require('express'); 
var fs = require('fs'); 

var app = express.createServer(express.logger()); 

app.get('/', function(request, response) { 
    fs.readFile('index.html', function(err, data){ 
     response.send(data.toString()); 
    }); 
}); 

var port = process.env.PORT || 5000; 
app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 
+0

你不是叫'.END()'當你完成發送?我使用NodeJS已經有一段時間了。 –

+2

當我用readFileSync替換readFile時,你是什麼意思?第一個需要回撥,而另一個則不需要。代碼應該是'var data = fs.readFileSync('index.html');'。回調從不被調用,因爲'readFileSync'不使用它。這就是超時來自的地方。假設我理解正確。 – freakish

+1

@CrazyTrain他使用Express。它爲你做到了。 – freakish

回答

25

fs.readFile需要一個回調這就要求response.send你表現出 - 好。如果你簡單地用fs.readFileSync代替它,你需要意識到它不需要回調,所以調用response.send的回調將永遠不會被調用,因此響應永遠不會結束,並且會超時。

如果您不是簡單地用readFileSync替換readFile,則需要顯示readFileSync代碼。

此外,您應該知道,您應該從不在節點express/webserver中調用readFileSync,因爲它將在執行I/O時綁定單線程循環。您希望節點循環處理其他請求,直到I/O完成並且您的回調處理代碼可以運行。

+8

可以在服務器啓動時調用readFileSync從磁盤加載SSL證書,因爲您需要阻止這些SSL證書,直到這些證書準備就緒。但是,你的大點完全正確。 – dankohn

+0

@bryanmac謝謝,我在哪裏可以瞭解哪些功能可以使用或不使用節點/快速應用程序? – Ali

+4

約定是所有API都是異步的,異常使用xxxSync格式。避免xxxSync,除非你有意識地同步(啓動或腳本)。服務器應該是異步的。 – bryanmac

7
'use strict' 
var fs = require("fs"); 

/*** 
* implementation of readFileSync 
*/ 
var data = fs.readFileSync('input.txt'); 
console.log(data.toString()); 
console.log("Program Ended"); 

/*** 
* implementation of readFile 
*/ 
fs.readFile('input.txt', function (err, data) { 
    if (err) return console.error(err); 
    console.log(data.toString()); 
}); 

console.log("Program Ended"); 

爲了更好地理解運行上面的代碼,並比較結果..