2016-12-05 3 views
1

내 애플리케이션 용 미들웨어로 Express.js를 사용하고 있습니다. 내 프론트 엔드 애플리케이션은 몇 초마다 서로 다른 매개 변수를 사용하여 신속한 경로를 호출합니다. 그런 다음 경로는 제 3 자 API에 대한 각 매개 변수를 호출합니다. 각 호출 내에서 데이터가 배열에 추가됩니다. for 루프가 끝나면 배열을 프론트 엔드로 다시 보냅니다.Express JS 전송 배열은 항상 비어 있습니다.

경로 내에 배열을 선언했지만 반환 된 결과는 비어 있습니다. 배열 외부에 배열을 선언하면 작동하지만 동시에 여러 요청이있을 때 최적이 아닙니다.

server.js

app.get('/prices', function(req, res){ 

//array for holding all feeds 
var feedData = []; 

//Url params 
var target = req.param('target'); 

//Convert the params to an array 
var targetArray = target.split(','); 

//Loop through targets and do request 
for (var i = 0; i < targetArray.length; i++) { 

    //API endpoint 
    var url = xxx; 
    request(url, function (error, response, body) { 

    //Parse the XML body to javascript objects or json 
    parseString(body, function (err, result) { 


    //Store result in js object 
    var resultObject = result; 
    var arrayObject = resultObject.quotes.quote; 

    feedData.push(arrayObject[0]) 

    }); 

}); 
} 
console.log(feedData); 
res.send(feedData); 

//Clear feedData 
feedData = []; 


}); 

그래서 결론은 배열이 비어 있다는 것입니다. 어떤 제안?

+1

'async' 요청 – Weedoze

답변

3

당신은 노드 JS (물론, 자바 스크립트)

request에 대한 호출이 비동기, 콜백을 허용하지만, 그 위에 스커트하고 그래서 최종 console.log(feedData); 등의 비동기 자연에 물린있어 ... request 콜백이 호출되기 전에 호출이 호출됩니다.

비동기 라이브러리를 사용하여, 특정 eachSeries

에, 코드의 비 시험 예를 async 모듈에서보세요 : 자바 스크립트가 비동기 및 데이터를 전송하기 때문에

app.get('/prices', function(req, res) { 

    //Url params 
    var target = req.param('target'); 

    //Convert the params to an array 
    var targetArray = target.split(','); 

    //array for holding all feeds 
    var feedData = []; 

    async.eachSeries(targetArray, function(targetArrayItem, cb) { 

     request(url, function(error, response, body) { 
      //Parse the XML body to javascript objects or json 
      parseString(body, function(err, result) { 


       //Store result in js object 
       var resultObject = result; 
       var arrayObject = resultObject.quotes.quote; 

       feedData.push(arrayObject[0]) 

       //call the callback to iterate next item in targetArray 
       cb(); 
      }); 
     }); 

    }, function(err) { 
     //all done 

     console.log(feedData); 
     res.send(feedData); 

     //Clear feedData 
     feedData = []; 
    }) 
}); 
+1

감사합니다. 나는 비동기 열차에 타격을 입었다 고 느끼고 있었다. 단지 그것을 이해할 수 없었다. 이제는 의미가 있습니다. – TietjeDK

+0

아무 문제 없어, 기꺼이 도왔습니다 – Alex

0

입니다 준비되기 전에 마지막 요청 응답을 확인하고 수집 된 데이터를 반환해야합니다.

app.get('/prices', function(req, res){ 

//array for holding all feeds 
var feedData = []; 

//Url params 
var target = req.param('target'); 

//Convert the params to an array 
var targetArray = target.split(','); 

//Loop through targets and do request 
for (var i = 0; i < targetArray.length; i++) { 

    //API endpoint 
    var url = xxx; 
    request(url, function (error, response, body) { 

    //Parse the XML body to javascript objects or json 
    parseString(body, function (err, result) { 


    //Store result in js object 
    var resultObject = result; 
    var arrayObject = resultObject.quotes.quote; 

    feedData.push(arrayObject[0]); 

    //If is last request return result 
    if(i==targetArray.length-1){ 
      console.log(feedData); 
      return res.send(feedData); 
    } 
    }); 

}); 
} 
}); 
+0

이것은 작동하지 않습니다, 당신은'targetArray'가'request'에 대한 콜백 밖에 있습니다 - for 루프를 반복하지 않습니다 – Alex

관련 문제