2016-04-28 7 views
0

からステータス、本体、およびヘッダーを取得:return {status: curlStatus, body: curlBody, headers: curlHeaders};にブレークポイントを配置IはNode.jsのアプリケーションで次のコードを持っているノード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(); 

bodyheaders、及びstatusCodeが正常にされていることを示しています人口が多い。しかし、curl.perform()の後にブレークポイントを置くと、curlStatuscurlBody、およびcurlHeadersの変数はまだ空の文字列であることがわかります。情報を親関数に渡すにはどうすればよいですか?

+1

javascriptでの実行は本質的に連続的ではありません(そのように考える方が良い)、 'curl.on( 'end')'に渡されるコールバック関数は 'curl.perform'の後のかなり後に実行されます。したがって、 'curl.perform()'のすぐ後のブレークポイントは何も表示しません。 – zeronone

答えて

2

ようこそJavaScriptと非同期の問題。

curl.perform();を実行すると、要求が開始されますが、まだ実行されていないため、変数curlXにまだ値が設定されていません。
要求が完了すると、url.on('end', function...で定義したコールバックが呼び出され、これらの変数が設定されます。

+0

ああ、理論的にはこれを修正する約束のようなものを使うことができましたよね? –

+0

はい、Promiseのすべてをラップして結果を得ることができます。または、コールバック内にスクリプトの次のステップを記述します。 – Cyrbil

2

私はアドオンの作成者です。

非同期インターフェイスに問題がある場合、または同期ソリューションが必要な場合は、しばらく前にEasyのサポートを追加しました。これらはほぼlibcurl easy interfaceのように使用されています。

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)); 

ただし、ユーザーフレンドリーではありません。以来、あなたはボディ配列を構築し、あなた自身のヘッダオブジェクトを作成する必要があります。

HEADERFUNCTIONおよびWRITEFUNCTIONコールバックはそれぞれ応答本体とヘッダーチャンクを受信します。 bufはNode.js Bufferオブジェクトです。

関連する問題