2016-12-04 3 views
0

Ich habe einen einfachen NodeJS-Server, der Daten von einem anderen Server abruft und sie in einer JSON-Datei speichert, ich muss einen Status über jede abgerufene und generierte Datei schreiben, aber das funktioniert nicht, weil ich Response.End() auszuführen haben, die, dass ich wieder in den Stream kann nicht schreiben impliziert, ohne hier den Strom endetNodeJS schreiben Antwort auf Browser mehrmals

mein Code:

 var http = require('http'); 
    var module = require('fs'); 
    var APIs = [ '/servlet/en', '/servlet/fr' ]; 
    var langs =[ 'en', 'fr' ]; 
    var finish = false; 
    var host = 'http://www.localtest'; 
    const port = process.argv[2] || 9000; 
    var responses = []; 

    http.createServer(function (req, response) { 

    for (x in APIs){ 
     console.log(x); 
    var options = { 
     host: 'localtest', 
     port: 8888, 
     path: APIs[x], 
     lang: langs[x] 
    }; 

    http.get(options, function(res) { 
     res.setEncoding('utf8'); 
     var body=''; 
     res.on('data', function(chunk){ 
      body += chunk; 
     }); 
     res.on('end', function(chunk){ 
      responses.push(body); 

      if (responses.length == 2){ 
      var d = JSON.parse(responses[1]); 
      var d2 = JSON.parse(responses[0]); 

     module.writeFileSync("options.lang1"+".json",JSON.stringify(d) , 'utf-8'); 
     module.writeFileSync("options.lang2"+".json",JSON.stringify(d2) , 'utf-8'); 
     } 
     }); 

    }); 

    } 

    }).listen(parseInt(port)); 

    console.log(`Server listening on port ${port}`); 

Ein Beispiel, habe ich versucht zu schreiben eine Nachricht an den Benutzer nach der Zeile: answers.push (body); mit response.write(), aber diese Methode benötigt eine response.end(), um ausgeführt und im Browser angezeigt werden, Wenn ich das tun kann ich nicht mehr in den Stream schreiben!

+0

Mögliche Duplikat [Rückruf, nachdem alle asynchronen forEach Rückrufe abgeschlossen werden] (http://stackoverflow.com/questions/18983138/callback-after-all-asynchronous-foreach-callbacks-are-completed) –

+0

Es Beantwortet meine Frage nicht !!!! – M1M6

+0

Vielleicht habe ich die Frage falsch interpretiert. Kümmere dich darum, es zu klären? Warum denkst du, dass "response.end()" zu einem Problem werden kann? –

Antwort

0

Probleme mit Ihrem Code hier. Als erstes sollten Sie module nicht als Variable verwenden, da dies ein Wort ist, das bereits im Modulierungssystem des Knotens verwendet wird, z. in module.exports

Zweitens möchten Sie wirklich einige Kontrolle fließen dort. Hier ist ein vollständiges Beispiel mit der Bibliothek async, obwohl andere Promises bevorzugen.

var http = require('http'); 
    var fs = require('fs'); 
    var APIs = [ '/servlet/en', '/servlet/fr' ]; 
    var langs =[ 'en', 'fr' ]; 
    var host = 'http://www.localtest'; 
    const port = process.argv[2] || 9000; 

    const async = require('async'); 
    let responses = []; 

    function fetchAndWriteFile(lang, callback){ 
    var options = { 
     host: 'localtest', 
     port: 8888, 
     path: '/servlet/'+lang, 
     lang: lang 
    }; 

    http.get(options, function(res) { 
     res.setEncoding('utf8'); 
     const filename = 'options.'+lang+'.json'; 
     const fileStream = fs.createWriteStream(filename, {defaultEncoding: 'utf-8'}); 
     fileStream.on('end', (e)=> { 
      if(e) return callback(e); 
      return callback(null, filename); 
     }); 

     res.pipe(fileStream) 
    }); 
    } 

    http.createServer(function (req, response) { 
    // this will run the fetchAndWriteFile once for each lang in langs 
    async.map(langs, fetchAndWriteFile, (e, files) => { 
     response.end(files); // files will be an array of filenames saved 
    }); 

    }).listen(parseInt(port)); 

    console.log(`Server listening on port ${port}`); 
+0

Danke, es funktioniert wie von meinem Code, wenn ich das Skript ausführen, zeigt der Browser immer das Laden-Symbol (obwohl die Dateien generiert und gespeichert werden), ist mein Hauptproblem mit dem Schreiben von ein wenig Text in den Browser – M1M6

+0

ja, und was ich zeigen, wie das geht (Schreiben der Antwort auf den Browser, nachdem beide gespeichert wurden). – Paul

+0

Vielen Dank, es funktioniert jetzt gut – M1M6