2014-12-05 7 views
0

오늘 Linode API에이 요청을하고 있습니다.변수에 request.https 응답 받기

var options = { 
    hostname: 'api.linode.com', 
    path: '', 
    port: 443, 
    method: 'GET' 
} 

var req = https.request(options, function(response) { 
    response.setEncoding('utf8'); 
    response.on('data', function(d) { 
     body = JSON.parse(d.toString()); 
    }); 

    response.on('end', function() { 
     console.log(body); 
    }); 
}).end(); 

출력이이 예제에서 예상대로 작동합니다.

그러나 응답을 변수에 넣고 콘솔에 기록하지 않아야합니다. console.log() 기능 또는 return 절 같은 외모가 요청의 끝을 기다리고되지 않기 때문에 위의 코드를 실행

var body = ''; 
var req = https.request(options, function(response) { 
    response.setEncoding('utf8'); 
    response.on('data', function(d) { 
     body = JSON.parse(d.toString()); 
    }); 
}).end(); 
console.log(body); 
return body; 

는 대답은 항상 비어 있습니다.

setTimeout(function() { console.log(body); }, 2000) 기능을 사용하여 문제가 해결되었지만 각 요청마다 시간 제한이 달라 지므로 솔직히 말해서 문제를 해결할 수는 없습니다.

내가 시도한 다른 솔루션은 while (!req.finished) {} console.log(body);이지만 예상대로 작동하지 않습니다.

마지막으로, 나는이 추가하려고 :

response.on('end', function() { 
    return body; 
}); 

을하지만,뿐만 아니라 더 성공 :(말했다

, 당신은 이전 값을 반환 요청 제한 시간이 기능 대기를 만들기 위해 어떤 제안하지 않는다

+0

약속을 되풀이하고, '다음으로'그것이 성취 될 때 무엇인가하십시오. –

+0

@torazaburo 예제가 있습니까? 미안 해요. 아이디어는 있어요.하지만 어떻게 할 수 있는지 모르겠군요. 감사! –

+0

이 주제에 관해서는 약 10 가지가 넘습니다. 그들을 찾으십시오. 예를 들어 http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call을 참조하십시오. –

답변

2

가장 간단한 방법은 (적어도) 콜백에서받는 함수에 코드를 삽입하는 것입니다 body 변수의?. 당신은 또한 모든에서 데이터를 버퍼링 할 수 있습니다3210 이벤트는 오직 하나만 있다고 가정 할 수 없기 때문에 발생합니다. 예 :

// you may want to add other parameters too depending on your needs of course ... 
function linodeReq(cb) { 
    var options = { 
    hostname: 'api.linode.com', 
    path: '', 
    port: 443, 
    method: 'GET' 
    } 

    https.get(options, function(response) { 
    var buffer = ''; 
    response.on('data', function(d) { 
     buffer += d; 
    }).on('end', function() { 
     var body; 
     try { 
     body = JSON.parse(buffer) 
     } catch (err) { 
     return cb(err); 
     } 
     cb(null, body); 
    }).setEncoding('utf8'); 
    }); 
} 

// then use it like ... 

linodeReq(function(err, result) { 
    // check for `err` first ... 
}); 

또한가 발생할 경우 콜백에 전달, (그리고 response) 개체도 요청에 error 이벤트를 처리해야합니다. 예를 들어 호스트 이름을 확인할 수 없거나 다른 연결 오류가 발생할 수 있습니다.

+0

감사합니다 @mscdex, 매력처럼 작동합니다! –