2017-09-25 1 views
2

정보를 얻고 사용자에게 보내려면 노드 서버가 다른 서버와 연결해야합니다. 요청은이 상황에서 비동기 적이므로 일반적으로 request-promise와 같은 추가 라이브러리를 사용합니다. 하지만 여기에서는 여러 지점에서 여러 번 전화가 왔기 때문에이를 처리 할 수있는 하나의 함수를 만들었으므로이 솔루션은 작동하지 않습니다.노드 js는 다른 기능의 요청을 사용합니다.

apiCall1: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 
apiCall2: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 

function fetchFromOtherServer(){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
    if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     return body; 
    } 
    } 
} 

그래서 먼저 fetchFromOtherServer 함수를 호출하는 apiCall() 함수에 대한 api 호출을 얻습니다. 그러나 요청이 완료되기 전에 노드는 정보 변수를 정의되지 않은 것으로 표시하고이를 사용자에게 보냅니다. 다른 서버에서 응답을받을 때까지 노드가 대기하도록 코드를 변경하려면 어떻게해야합니까?

답변

0

자신 만의 약속이 필요하며 약속에 따라 핸들러를 사용하고 싶을 것입니다. promise documention 및 그 예를 살펴보십시오.

apiCall1 :

function(req,res){ var info_promise = fetchFromOtherServer(); 
    info_promise.then(function(info) { 
    console.log(info); // undefined 
    res.send(info) 
    }); 
    # Also look into catch on promises for error 
} 

function fetchFromOtherServer(){ 
    return new promise(function(resolve, fail){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
     if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     resolve(body); 
     } 
    } 
    }); 
} 
0

당신이 ES6를 사용하는 경우 asyncawait과 함께 할 것입니다. 코드를 단순화합니다.

apiCall1: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 
apiCall2: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 

async function fetchFromOtherServer(){ 
    let options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    let response = await request(options); 
    return response; 
} 
+0

지금 터미널은 "await"구문에 오류가 있습니다. 내 노드 프로젝트에 어떻게 ES6을 포함시킬 수 있습니까? package.json에서 어떤 작업을 수행합니까? – ampher911

+0

'babel' 또는'typescript'를 사용하지 않으면 네이티브'async' 지원을 위해'node 7.x'가 필요합니다. – nilobarp