web-dev-qa-db-ja.com

Node.jsの単一のHTTPリクエストで複数のHTTPリクエストを呼び出す

単一の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出力を配列に追加してエンドユーザーに送信することです。

ありがとう

9
Vaibhav Jain

ここで、このコードを試してください、

_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を使用してそのコールバックを呼び出します。

21
yoogeeks

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を使用できます。

4
Ita