2016-04-28 4 views
0

Ich habe folgende Code in einer Node.js Anwendung:Abrufen der Status, Körper und Headern von dem Knoten-Libcurl

var curlStatus = ""; 
var curlBody = ""; 
var curlHeaders = ""; 
var curlInfo = curl.on('end', function(statusCode, body, headers){ 
    curlStatus = statusCode; 
    curlBody = body; 
    curlHeaders = headers; 

    //this.close(); 
    return {status: curlStatus, body: curlBody, headers: curlHeaders}; 
}); 

curl.on('error', function(){ 
    console.log("CURL ERROR"); 
}); 

curl.perform(); 

einen Haltepunkt auf return {status: curlStatus, body: curlBody, headers: curlHeaders}; Platzierung zeigt, dass die body, headers und statusCode werden erfolgreich besiedelt. Ein Setzen eines Haltepunkts nach curl.perform() zeigt jedoch, dass die Variablen curlStatus, curlBody und curlHeaders immer noch leere Zeichenfolgen sind. Wie gebe ich die Informationen an die Elternfunktion weiter?

+1

Die Ausführung in Javascript ist nicht im Wesentlichen sequenziell (besser so zu denken), die Callback-Funktion in 'curl.on ('end')' übergeben wird zu einem viel späteren Zeitpunkt nach 'curl.perform' ausgeführt. Ein Breakpoint direkt nach 'curl.perform()' zeigt also nichts. – zeronone

Antwort

2

Willkommen bei Javascript und asynchronem Problem.

Wenn Sie curl.perform(); tun, wird die Anfrage gestartet, ist aber noch nicht fertig, deshalb ist Ihre Variable curlX noch nicht gefüllt.
Sobald die Anfrage abgeschlossen ist, wird der Rückruf, den Sie mit url.on('end', function... definiert haben, aufgerufen, und Sie werden diese Variablen auffüllen.

+0

Ah okay, theoretisch könnte ich etwas wie ein Versprechen nutzen, um das zu beheben, oder? –

+0

Ja, Sie können alles in ein Versprechen einpacken und Ihre Ergebnisse erhalten. Oder schreibe den nächsten Schritt deines Skripts in deinen Callback. – Cyrbil

2

Ich bin der Autor des Addons.

Wenn Sie Probleme mit der asynchronen Schnittstelle haben oder eine synchrone Lösung benötigen, habe ich die Unterstützung für Easy Handles vor einiger Zeit hinzugefügt, sie werden fast genau wie die libcurl easy interface verwendet.

var Easy = require('node-libcurl').Easy, 
    Curl = require('node-libcurl').Curl, 
    url = process.argv[2] || 'http://www.google.com', 
    ret, 
    ch; 

ch = new Easy(); 

ch.setOpt(Curl.option.URL, url); 

ch.setOpt(Curl.option.HEADERFUNCTION, function(buf, size, nmemb) { 

    console.log('HEADERFUNCTION: '); 
    console.log(arguments); 

    return size * nmemb; 
}); 

ch.setOpt(Curl.option.WRITEFUNCTION, function(buf, size, nmemb) { 

    console.log('WRITEFUNCTION: '); 
    console.log(arguments); 

    return size * nmemb; 
}); 

ret = ch.perform(); 

ch.close(); 

console.log(ret, ret == Curl.code.CURLE_OK, Easy.strError(ret)); 

Es ist weniger benutzerfreundlich jedoch. Seit jetzt müssen Sie das Body-Array erstellen und das Header-Objekt selbst erstellen.

HEADERFUNCTION und WRITEFUNCTION Callbacks erhalten die Antwort Körper und Header Chunks jeweils. buf ist ein Node.js Buffer Objekt.

Verwandte Themen