Получение статуса, тела и заголовков из 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
объект.