2017-10-03 1 views
0

Dieser Code scheint verhalten Ok, aber wenn ich versuche, die Datei (someFile.json) in der letzten Zeile zu lesen, funktioniert einfach nicht. :-(Bitte einige Ahnung. Obwohl ich das Problem ist komplex wissen.Ein Problem in node.js fs.createWriteStream

var fs = require('fs'); 

var request = require("request") 


var dataFile = 'data/someFile.json' 
var url = "https://api.someUrl" 
var file = fs.createWriteStream(dataFile); 
request(url).pipe(file); 

file.on('finish',function(){ 
    console.log('file download to ',dataFile) 
    file.destroy(); 
    //file.closeSync; 
    file.on('close', function(){ console.log('File Closed ')}) 
}) 


var datos = fs.readFileSync(dataFile, 'utf8'); 
+0

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. –

Antwort

0

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.

  1. Erstellen Sie WriteStream
  2. Initiieren http request()
  3. Hängen Sie zukünftige Daten aus dem request() an Ihren Stream mit .pipe().
  4. Register finish Ereignishandler im Stream.
  5. Anruf fs.readFileSync() die Datei
  6. Daten kommen von request() zu lesen und an den Schreibstrom gesendet, wo sie gepuffert werden können.
  7. Weitere Daten kommen von request() und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
  8. Die Anforderung wird abgeschlossen, und der WriteStream wird angewiesen, seine Daten auf die Festplatte zu spülen und sich selbst zu schließen.
  9. Das Ereignis finish tritt auf.
  10. Sie registrieren einen close Event-Handler.
  11. 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:

  1. erstellen Writestream
  2. Initiieren http request()
  3. Haken Zukunft Daten aus dem request() zu Ihrem Stream ankommen mit .pipe().
  4. Register finish Ereignishandler im Stream.
  5. Register close Event-Handler.
  6. Daten kommen von request() und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
  7. Weitere Daten kommen von request() und werden an den Schreibstream gesendet, wo sie gepuffert werden können.
  8. Die Anforderung wird abgeschlossen, und der WriteStream wird angewiesen, seine Daten auf die Festplatte zu spülen und sich selbst zu schließen.
  9. Das Ereignis finish tritt auf.
  10. Das Ereignis close tritt auf.
  11. Anruf fs.readFileSync() die Datei
+0

Ehrfürchtig !. Vielen Dank für Ihre Zeit und gute Ratschläge jfriend00 und auch für Sumner Evans. Danke Leute. Jetzt weiß ich ein wenig mehr über node.js – Hender

+0

Nur muss ich sagen, dass Anfrage nicht hat und "Ende" -Ereignis aber ein "Ende" – Hender

+0

@Hender - Korrigiert. Danke. – jfriend00