Sie versuchen, die Datei zu lesen, bevor sie geschrieben wurde. Die Writestream Sie schreiben, ist asynchron. Das heißt, es einige unbestimmte abgeschlossen Zeit in der Zukunft. in der Zwischenzeit, der Rest des Codes weiter Sie ausführen und so versuchen, es zu lesen, bevor die Datei beendet wurde.
im Code, den Sie haben, hier ist die Abfolge der Ereignisse.
- Erstellen Sie WriteStream
- Initiieren http
request()
- Hängen Sie zukünftige Daten aus dem
request()
an Ihren Stream mit .pipe()
.
- Register
finish
Ereignishandler im Stream.
- Anruf
fs.readFileSync()
die Datei
- Daten kommen von
request()
zu lesen und an den Schreibstrom gesendet, wo sie gepuffert werden können.
- Weitere Daten kommen von
request()
und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
- Die Anforderung wird abgeschlossen, und der WriteStream wird angewiesen, seine Daten auf die Festplatte zu spülen und sich selbst zu schließen.
- Das Ereignis
finish
tritt auf.
- Sie registrieren einen
close
Event-Handler.
- Das Ereignis
close
tritt auf.
Sie können wahrscheinlich verwenden Stream-Benachrichtigungen zu tun, was Sie wollen, aber nur die Datei zu testen, können Sie die fs.readFileSync()
im Abschluss-Handle für das close-Ereignis auf dem Schreibstrom setzen.
const fs = require('fs');
const request = require("request")
const dataFile = 'data/someFile.json'
const url = "https://api.someUrl"
const file = fs.createWriteStream(dataFile);
request(url).pipe(file);
file.on('finish',function(){
console.log('file download to ',dataFile)
}).on('close', function(){
console.log('File Closed ');
// file is available for reading now
var datos = fs.readFileSync(dataFile, 'utf8');
console.log(datos);
});
Auch müssen Sie nicht .destroy()
den Stream. Standardmäßig wird es auf eingestellt, das automatisch geschlossen wird, wenn der Stream, den Sie an ihn weitergeleitet haben, fertig ist. Und Sie möchten nicht Ihre .on('close', ...)
Event-Handler in Ihrem finish
Error-Handler.
In diesem neuen Code vorgeschlagen, hier ist die Abfolge der Ereignisse:
- erstellen Writestream
- Initiieren http
request()
- Haken Zukunft Daten aus dem
request()
zu Ihrem Stream ankommen mit .pipe()
.
- Register
finish
Ereignishandler im Stream.
- Register
close
Event-Handler.
- Daten kommen von
request()
und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
- Weitere Daten kommen von
request()
und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
- Die Anforderung wird abgeschlossen, und der WriteStream wird angewiesen, seine Daten auf die Festplatte zu spülen und sich selbst zu schließen.
- Das Ereignis
finish
tritt auf.
- Das Ereignis
close
tritt auf.
- Anruf
fs.readFileSync()
die Datei
Knoten ist ** ** asynchron zu lesen. Die letzte Zeile wird ausgeführt, bevor die Datei fertig geschrieben ist. Wenn Sie es innerhalb des Callbacks zu 'file.on' setzen, sollte es funktionieren. –