2016-04-28 22 views
0

我已經在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(); 

return {status: curlStatus, body: curlBody, headers: curlHeaders};放置一個斷點表明bodyheadersstatusCode成功是填充。但是,在curl.perform()之後放置一個斷點表示curlStatus,curlBodycurlHeaders變量仍爲空字符串。我如何將信息傳遞給父函數?

+1

在javascript中的執行本質上並不是連續的(更好的方式是這樣),傳遞給'curl.on('end')'的回調函數在'curl.perform'之後的很多時間執行。因此,curl.perform()後面的斷點不會顯示任何東西。 – zeronone

回答

2

歡迎使用javascript和異步問題。

當你做curl.perform();時,請求會開始但尚未完成,爲什麼你的變量curlX尚未填充。
請求完成後,將調用您用url.on('end', function...定義的回調,並且您將填充這些變量。

+0

啊好吧,所以理論上我可以使用類似承諾來解決這個問題,對吧? –

+0

是的,您可以將所有內容都包裹在承諾中並獲得結果。或者在回調中寫下腳本的下一步。 – 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)); 

然而,它的用戶不太友好。從現在開始,您需要構建body數組並自己創建標頭對象。

HEADERFUNCTIONWRITEFUNCTION回調將分別接收響應正文和標題塊。 buf是一個Node.js Buffer對象。