単一のURL呼び出しで複数のURLを呼び出し、配列でjson応答をプッシュし、エンドユーザーへの応答としてその配列を送信しようとしています。
私のコードは次のようになります:
var express = require('express');
var main_router = express.Router();
var http = require('http');
urls = [
"http://localhost:3010/alm/build_tool",
"http://localhost:3010/alm/development_tool",
"http://localhost:3010/alm/project_architecture"];
var responses = [];
main_router.route('/')
.get(function (req, res) {
var completed_requests = 0;
for (url in urls) {
http.get(url, function(res) {
responses.Push(res.body);
completed_request++;
if (completed_request == urls.length) {
// All download done, process responses array
}
});
}
res.send(responses);
});
また、npmリクエストモジュールを使用してこれを試しました。このコードを実行すると、NULLのみ、またはヘッダーのみのランダムな出力のみが返されます。
私の目的は、単一のノード取得リクエストで複数のURLを呼び出し、そのJSON出力を配列に追加してエンドユーザーに送信することです。
ありがとう
ここで、このコードを試してください、
_const async = require('async');
const request = require('request');
function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
callback(err, body);
}
);
}
const urls= [
"http://localhost:3010/alm/build_tool",
"http://localhost:3010/alm/development_tool",
"http://localhost:3010/alm/project_architecture"
];
async.map(urls, httpGet, function (err, res){
if (err) return console.log(err);
console.log(res);
});
_
説明:このコードは async および request ノードパッケージを使用します。 _async.map
_は、定義により3つのパラメーターを受け取ります。1つは配列、2つ目はその配列の各要素で呼び出すイテレーター関数、およびasync.mapの処理が終了したときに呼び出されるコールバック関数です。
map(arr, iterator, [callback])
イテレータ関数を通じてarrの各値をマッピングすることにより、新しい値の配列を生成します。イテレータは、arrのアイテムと、処理が終了したときのコールバックで呼び出されます。これらの各コールバックは、2つの引数を取ります。エラーと、arrから変換されたアイテムです。イテレータがコールバックにエラーを渡すと、メインのコールバック(マップ関数用)がエラーとともにすぐに呼び出されます。
注:イテレーター関数の呼び出しはすべて並列です。
HttpGet関数内では、渡されたURLを使用してrequest
関数を呼び出し、応答形式をjson
と明示的に指示しています。 request
は、処理が完了すると、3つのパラメーター、err-ある場合は、res-サーバーの応答、body-応答の本文でコールバック関数を呼び出します。 err
からのrequest
がない場合、_async.map
_はこれらのコールバックからの結果を配列として収集し、その配列を最後に3番目のコールバック関数に渡します。それ以外の場合、(err)がtrueの場合、_async.map
_関数は実行を停止し、err
を使用してそのコールバックを呼び出します。
async ライブラリを使用することをお勧めします。
async.map(urls, http.get, function(err, responses){
if (err){
// handle error
}
else {
res.send responses
}
})
上記のスニペットは、各URLに対してhttp.get
呼び出しを並行して実行し、すべての応答が受信された後、すべての呼び出しの結果を使用してコールバック関数を呼び出します。
URLを順番に呼び出す場合は、代わりにasync.mapSeries
を使用できます。同時リクエストの数を制限したい場合は、async.mapLimit
を使用できます。