2016-06-04 7 views
2

Wenn ein Browser oder Curl-Client meine Node-Express-App aufruft, möchte ich JSON-Daten von einer externen Website abrufen und zurückgeben, obwohl die verschachtelten http-Aufruf gebe die JSON-Daten zurück an meinen Express-Server Ich kämpfe darum, dass der JSON zum rufenden Browser zurückkehrt - wie mache ich das?In einer Nodejs-App wie stelle ich eine HTTP-Client-Anfrage innerhalb einer Express-Methode ein

Dies ist der aktuelle Test app Code mit curl Reaktion:

var http = require('http'); 
var app = require('express')(); 

app.get('/', function (req, res) { 

    var str = ''; 

    var options = { 
    host: 'jsonplaceholder.typicode.com', 
    path: '/posts/1' 
    }; 

    callback = function(response) { 
    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('end', function() { 
     console.log(str); 
    }); 
    } 

    var req = http.request(options, callback); 

    res.send(str); 
    req.end(); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

Hier ist das Ergebnis der Kräuselung localhost: 3000 (keine Körperdaten zurückgegeben): enter image description here

Die Show des Konsolenprotokolls Server-Seite Die http-Anfrage Daten wurden empfangen: enter image description here

Alle Vorschläge/Zeiger geschätzt!

+0

Wenn Sie versuchen, einfach mit dem zurück zu antworten, was Sie erhalten haben, dann '' 'app.get ('/', Funktion (req, res)) { res.status (200) .send (req.body); }); '' 'sendet das komplette json, das Sie auf Ihrer Serverseite haben, zurück zum Client. –

+0

Danke Vikram - Ich werde es versuchen. Was müsste ich tun, um die Antwort zu ändern, bevor Sie den Angerufenen zurückgeben? – Joelster

+0

Hallo Vikram, tut mir leid, ich konnte das nicht funktionieren, ich vermute, es ist das Warten auf die Fertigstellung, aber zum Glück sind in der Zwischenzeit einige funktionierende Antworten eingegangen. Danke jedenfalls! – Joelster

Antwort

6

Gerade als eine Alternative (die Antwort von marcelino zur Verfügung gestellt wird gut funktionieren), können Sie Ihren Code verkürzen (und ein wenig Speicherplatz sparen), indem die streams sowohl Express zur Verfügung gestellt mit und http.request(), wie folgt aus:

app.get('/', function(req, res) { 
    http.request('http://jsonplaceholder.typicode.com/posts/1', function(response) { 
    response.pipe(res); 
    }).on('error', function(e) { 
    res.sendStatus(500); 
    }).end(); 
}); 
+0

Schön - funktioniert wie ein Charme! – Joelster

+0

Götter Code unter uns – moeiscool

4

Es scheint, dass Sie warten müssen, für die verschachtelte Antwort zurück zu kommen, bevor die eigentliche Reaktion aussendet, etwa so:

app.get('/', function (req, res) { 

    var str = ''; 

    var options = { 
    host: 'jsonplaceholder.typicode.com', 
    path: '/posts/1' 
    }; 

    var callback = function(response) { 
    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('end', function() { 
     console.log(str); 
     res.send(str); // SEND ACTUAL RESPONSE HERE 
    }); 
    } 

    var req = http.request(options, callback); 
    req.end(); 

}); 

Andernfalls Sie str sofort senden und es ist leer, also warum Sie kann es nicht sehen.

+0

Die 'req.end()' sollte immer noch am Ende der Handler-Funktion sein, sonst wird die HTTP-Anfrage nicht gemacht. – robertklep

+0

@robertklep yep, ehrlicher Fehler, legte es vor 2 Minuten zurück! –

+0

Danke Marcelino - das macht Sinn! Werde es gleich ausprobieren. – Joelster

Verwandte Themen