Получение статуса, тела и заголовков из node-libcurl

У меня есть следующий код в приложении Node.js:

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}; показывает, что body, headers, а также statusCode успешно заселяются. Тем не менее, поставив точку останова после curl.perform() показывает, что curlStatus, curlBody, а также curlHeaders переменные по-прежнему пустые строки. Как передать информацию в родительскую функцию?

2 ответа

Решение

Добро пожаловать в JavaScript и асинхронную проблему.

Когда вы делаете curl.perform();запрос будет запущен, но еще не выполнен, поэтому ваша переменная curlX еще не заселены.
Как только запрос будет выполнен, обратный вызов, который вы определили с url.on('end', function... называется, и вы будете заполнять эти переменные.

Я автор аддона.

Если у вас есть проблемы с асинхронным интерфейсом или вам нужно синхронное решение, я добавил поддержку Easy Ручки некоторое время назад, они используются почти так же, как простой интерфейс libcurl.

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 и создать объект headers самостоятельно.

HEADERFUNCTION а также WRITEFUNCTION обратные вызовы будут получать тело ответа и заголовки, соответственно. buf это Node.js Buffer объект.

Другие вопросы по тегам