2016-12-05 4 views
1

私はアプリケーションのミドルウェアとしてExpress.jsを使用しています。私のフロントエンドアプリケーションは、数秒ごとに異なるパラメータで高速ルートを呼び出します。ルートは、各パラメータの呼び出しをサードパーティの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の非同期な性質にかまされている(まあ、Javascriptを)

requestへの呼び出しは非同期であり、コールバックを受け入れますが、あなたはそれの上に幅木いるので、あなたの最終console.log(feedData);など...コールはrequestのコールバックが呼び出される前に呼び出されます。

非同期ライブラリを使用して、特定のeachSeries

で、あなたのコードの非テストした例をasyncモジュールを見てみましょう:JavaScriptが非同期であり、あなたがデータを送信するため

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

関連する問題