2013-07-11 16 views
5

Piszę program pobierający z node.js i modułem żądania. Używając składni strumienia, robię to, aby pobrać plik, zapisać go i zadzwonić do oddzwonienia. Jednak w prawie 50% przypadków plik jest pusty lub w ogóle go nie utworzono. Nie wydarzenie nr error jest emitowane. Wygląda na to, że zdarzenie finish zostało wywołane, mimo że plik nie został jeszcze (całkowicie) napisany.Plik żądania Node.js czasami jest pusty lub nie istnieje

Kontekst: Całość jest pakowana w połączenia async.each.

Jakieś wskazówki? Dzięki!

+0

spróbuj debugować, dodając także '.on ('data'' listener i sprawdź, czy zawsze otrzymujesz dane, ale po prostu nie robisz tego na dysk. –

Odpowiedz

9

Trzeba zamknąć plik przed dostępem go:

var file = fs.createWriteStream(targetPath); 
var r = request(url).pipe(file); 
r.on('error', function(err) { console.log(err); }); 
r.on('finish', function() { file.close(cb) }); 

Nawiasem mówiąc, jeśli adres URL odpowiada z jakiegokolwiek błędu HTTP (takich jak 404 nie znaleziono), która nie wywoła zdarzenie „błędu” , więc powinieneś prawdopodobnie sprawdzić to osobno:

function handleFailure(err) { console.log(err); }; 

var file = fs.createWriteStream(targetPath); 
request(url, function(error, response) { 
    if (response.statusCode != 200) { 
     console.log("oops, got a " + response.statusCode); 
     return 
    } 
    // close is async, and you have to wait until close completes otherwise 
    // you'll (very rarely) not be able to access the file in the callback. 
    file.on('finish', function() { file.close(cb) }); 

    response.pipe(file).on('error', handleFailure) 
    file.on('error', handleFailure) 
}).on('error', handleFailure); 
Powiązane problemy