2013-07-11 12 views
18

Poniższy kod wyświetla zawartość pliku index.html (zawiera tylko tekst hello world) w przeglądarce. Jednak, gdy zamieniam readFile na readFileSync, czas oczekiwania na żądanie. czego mi brakuje? Czy wymagany jest inny rodzaj bufora? Używam węzeł 0,61 i wyrazić 2,4Różnica między plikiem readFile i 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

Czy nie powinien nazywać '.END()' kiedy skończysz wysyłanie? Minęło trochę czasu odkąd użyłem NodeJS. –

+2

Co masz na myśli przez 'kiedy zamieniam readFile na readFileSync'? Pierwszy wymaga wywołania zwrotnego, a drugi nie. Kod powinien mieć postać 'var data = fs.readFileSync ('index.html');'. Wywołanie zwrotne nigdy nie jest wywoływane, ponieważ 'readFileSync' go nie używa. Stąd pochodzi limit czasu. Zakładając, że rozumiem to poprawnie. – freakish

+1

@CrazyTrain Używa Express. Robi to za ciebie. – freakish

Odpowiedz

25

fs.readFile trwa rozmowa z powrotem w którym wzywa response.send jak wykazano - dobry. Jeśli po prostu zamienisz to na fs.readFileSync, musisz być świadomy, że nie wymaga on oddzwaniania, więc twoje wywołanie zwrotne, które wywołuje response.send, nigdy nie zostanie wywołane, a zatem odpowiedź nigdy się nie zakończy i upłynie limit czasu.

Musisz pokazać swój kod readFileSync, jeśli nie po prostu zamieniasz readFile na readFileSync.

Ponadto, jeśli wiesz, powinieneś nigdy wywołać readFileSync w węźle express/webserver, ponieważ będzie on wiązał pętlę pojedynczego wątku podczas wykonywania operacji we/wy. Chcesz, aby pętla węzła przetwarzała inne żądania aż do zakończenia operacji we/wy i uruchomienia kodu obsługi wywołania zwrotnego.

+8

Można wywołać readFileSync w celu załadowania certyfikatów SSL z dysku podczas uruchamiania serwera, ponieważ należy je zablokować, dopóki nie będą gotowe. Ale jesteś większy punkt jest całkowicie poprawny. – dankohn

+0

@ bryanmac thanks, Gdzie mogę dowiedzieć się więcej o tym, których funkcji użyć w aplikacji węzła/ekspresu? – Ali

+4

Konwencja to wszystkie interfejsy API asynchroniczne, a wyjątki używają formatu xxxSync. Unikaj xxxSync, chyba że masz świadomość, że jesteś synchroniczny (startup lub skrypt). Serwer powinien być asynchroniczny. – 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"); 

Dla lepszego zrozumienia uruchomić powyższy kod i porównać wyniki ..

Powiązane problemy