2014-12-24 1 views
2

Node.JS를 사용하여 HTTP GET 요청에서 JSON을 반환하는 데 문제가 있습니다. 나는 또한 운없이 response.on 범위 내에서 data을 반환 시도NodeJS의 http 요청에서 JSON 가져 오기

var http = require('http'); 

var options = { 
    host: 'some.host.com', 
    path: '/some/path' 
}; 

var callback = function(response) { 
    var raw = ''; 
    response.on('data', function(d) { 
    raw += d; 
    }); 
    response.on('end', function() { 
    var data = JSON.parse(raw); 
    }); 
    return data; 
}; 

http.request(options, callback).end() 

: 내가 가지고 올 것을 예제와 문서를 통해 읽기

이입니다. CURL을 사용하면 문제없이 데이터를 얻을 수 있습니다.

무엇이 잘못 되었습니까? JSON을 얻으려면 위의 코드를 어떻게 수정하면됩니까?

답변

2

콜백에서 값을 반환 할 수 없습니다.

콜백에서 값을 얻는 경우 다른 콜백을 사용하여 값을 추출하거나 그 자리에서 사용해야합니다. 반환 할 수 없습니다. 질문은 항상 "이 데이터가 생겼으니 이제는 그걸로 무엇을하고 싶니?" 응답 "반품"은 허용되지 않습니다.

var http = require('http'); 

var options = { 
    host: 'some.host.com', 
    path: '/some/path' 
}; 

var useData = function(data) { 
    // do something 
} 

var callback = function(response) { 
    var raw = ''; 
    response.on('data', function(d) { 
     raw += d; 
    }); 
    response.on('end', function() { 
     var data = JSON.parse(raw); 
     useData(data); 
    }); 
}; 

http.request(options, callback).end() 

(또한없는 기본 문제,하지만 당신은 두 data라는 이름의 변수가 있습니다 :. var data 라인에 하나의 로컬 및 return 또 다른 세계를)

예를 들어,이 작업을해야

편집 :

나는 매우 혼란 스러워요 왜 수 없습니다 "반환"콜백에서 값. 함수에 반환 값/변수가 없거나 값으로 계산되지 않습니까?

하지만 너무 늦었습니다. 유추 시간.

동기 :

마르다는 대화가 끝날 때까지 참을성있게 기다립니다, 전화를받을 존을 알려줍니다. 그런 다음 그녀는 그것이 누구이며 원하는 것을 묻습니다. 존은 자신의 이웃이 설탕 한 잔을달라고 요청했다. 그녀는 그에게 이웃에게 가서 설탕 한 잔을 줄 것을 그에게 말한다. 그런 다음, 그녀는 친구들을 만나러 나간다.

var reply = john.answerPhone(); 
var action = reply.figureOutResponse(); 
john.tellToDo(action); 

잘못된 비동기 :

마사는 전화에 응답하고, 그것이 무엇인지 그녀에게 존을 알려줍니다 그녀의 친구를 만나러 간다. 그녀는 그녀가 집을 떠나 자마자 John이 들었던 대답을 처리하려고 시도합니다. 그러나 John은 아직 수신기를 들지 않았습니다. 그녀에게 아무 말도하지 않았기 때문에, 그녀는 신경 쇠약 증세가 있습니다. 그녀가 그 편지를 읽으려고했다면, 여전히 종이에 비어있는 종이입니다. (아마도 그것이 여전히 집에 있다는 사실을 무시하더라도) 그녀는 또 다른 고장을 가지고 있습니다. 아무도 여전히 신경 쓰면 5 분 뒤 존이 전화를 끊고 마르타가 더 이상 존재하지 않기 때문에 자신의 이웃이 빈 집에 설탕을 필요로한다는 사실을 발표합니다. 경우를 대비해, 그는 또한 메모를 씁니다. 그에게 무엇을해야할지 아무에게도 말하지 않은 그는 신문을 들고 시간을 낭비하기 시작합니다. 노트는 결코 읽히지 않습니다.

var note; 
var reply = john.answerPhone(function(reply) { 
    note = reply; 
    return reply; 
}; 
note.figureOutResponse(); 
// Cannot read property 'figureOutResponse' of undefined 
reply.figureOutResponse(); 
// Cannot read property 'figureOutResponse' of undefined 

올바른 비동기 :

마사가 전화를, 그녀가 친구들과 만나 데이트를 가지고 있기 때문에 정보와 함께 다시 그녀의 전화를 존을 알려줍니다. 그녀는 나간다. 그리고 John은 전화를 받는다. 5 분 후 존은 마르타의 핸드폰에 그것이 설탕을 찾는 이웃이라고 말했습니다. 그녀는 그에게 컵을 채우고 이웃에게 주라고 말한 다음 끊고 버스 타기를 계속합니다.

var marthasCellphone = function(data, respondCallback) { 
    var action = data.figureOutResponse(); 
    respondCallback(action); 
} 
john.answerPhone(function(data) { 
    // callback here: no returns, pass data on to another callback 
    var action = marthasCellphone(data, function(action) { 
     // another callback here; use action immediately 
     john.tellToDo(action); 
    });   
}); 
reply.figureOutResponse(); 
+0

콜백에서 값을 "반환"할 수없는 이유는 상당히 혼란 스럽습니다. 함수에 반환 값/변수가 없거나 값으로 계산되지 않습니까? – CodeKingPlusPlus

+0

또한 REPL에서 JSON을 볼 수 있도록 주로 JSON을 전역 변수에 쓰려고합니다. – CodeKingPlusPlus

+0

고마워, 알아 냈어. – CodeKingPlusPlus

관련 문제