2017-07-10 3 views
0

Ich möchte eine sehr einfache Aufgabe erledigen, doch ich stecke fest!Ich kann HTTP GET nicht innerhalb eines anderen verschachteln mit node.js

Das Szenario ist wie folgt aus:

Nach einer GET-Anfrage an meine api, ich möchte http.get aus einer externen Website, und dann die Antwort von dieser externen Website auf die ursprüngliche api Anfrage senden zurück.

Offensichtlich sind die Aufrufe asynchron, so dass die Zeichenfolge LoremParagraph nicht korrekt geladen wird, bevor sie zurück an die API gesendet wird.

Auch ich bekomme den Fehler: Fehler: Kann Header nicht nach dem Senden festgelegt werden.

Hier ist mein Code:

module.exports = function(app, express) { 

var myLoremRouter = express.Router(); 

var loremParagraph = ''; 
//HTTP GET accessed at localhost:8081/mylorem 
myLoremRouter.get('/', function(req, res) { 

    // Fetch one paragpraphlorem ipsum text from http://www.faux-texte.com/text-random-1.htm 
    http.get("http://www.faux-texte.com/text-random-1.html", function(resp) { 
      resp.on('data', function(chunk) { 
       // console.log('BODY: ' + chunk); 
       var $ = cheerio.load(chunk); 
       loremParagraph = $('div.Texte').text(); 
       console.log(loremParagraph); 
       // console.log(resp.status); 

      }); 

     }) 
     // If any error has occured, log error to console 
     .on('error', function(e) { 
      console.log("Got error: " + e.message); 
     }); 

    //Finally send the result back to the api call 
    res.json({ message: loremParagraph }); 
}); 

return myLoremRouter; 

};

+0

Du nennst 'res.json' zweimal. Das ist es, was dir den Fehler gibt. Sie können eine Antwort nicht ändern, nachdem sie gesendet wurde. – Aron

+0

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

Antwort

0

Versuchen Sie dies. Hier werden Chunks hinzugefügt, bis wir bereit sind, die vollständigen Daten zu verwenden.

https://stackoverflow.com/a/21953201/6219247

myLoremRouter.get('/', function(req, res) { 
    var body = ''; 
    http.get({ 
     host: 'www.faux-texte.com', 
     port: 80, 
     path: '/text-random-1.html' 
    }, function(resp) { 
     resp.on('data', function(chunk) { 
      body += chunk; 
     }); 
     resp.on('end', function(chunk) { 
      var $ = cheerio.load(body); 
      loremParagraph = $('div.Texte').text(); 
      res.json({ message: loremParagraph }); 
     }); 
    }) 
    .on('error', function(e) { 
     // handle/send error 
     res.send(/*...*/); 
    }); 
}); 
+1

Ja das ist es! Vielen Dank, du hast mein Problem gelöst :) – Tasos

Verwandte Themen