web-dev-qa-db-ja.com

Node.JSのasync / awaitを使用した適切なリクエスト

私のプログラムでは、別のAPIモジュールから関数のasync呼び出しを行います。

var info = await api.MyRequest(value);

モジュールコード:

var request = require("request")

module.exports.MyRequest = async function MyRequest(value) {
    var options = {
        uri: "http://some_url",
        method: "GET",
        qs: {  // Query string like ?key=value&...
            key : value
        },
        json: true
    }

    try {
        var result = await request(options);
        return result;
    } catch (err) {
        console.error(err);
    }
}

実行はすぐに戻りますが、result、したがってinfoにはリクエストオブジェクトとリクエストボディが含まれます-info.bodykey=value&...のようで、レスポンスボディは不要です。

私が間違っているのは何ですか?直し方? requestの適切なasyncの使用法、またはここで述べたようなプロミスでのみ正常に動作します: ノード要求モジュールでawaitが動作しないのはなぜですか ?次の記事では、それが可能であると述べています: Node.jsで非同期待機をマスターする

21

requestモジュールやhttp.request()ではなく、request-promiseモジュールを使用する必要があります。

awaitは、requestオブジェクトを返し、コールバックまたはイベントリスナーを使用して処理が完了したことを確認する関数ではなく、Promiseを返す関数で動作します。

request-promiseモジュールはrequestモジュールと同じ機能をサポートしますが、その中の非同期関数はpromiseを返すため、コールバックではなく.then()またはawaitのいずれかを使用できます。 requestモジュールが必要です。

したがって、 request-promise module をインストールしてから、これを変更します。

var request = require("request");

これに:

const request = require("request-promise");

その後、次のことができます。

var result = await request(options);
41
jfriend00

次のこともできることを確認してください。必要なものがデフォルトでPromiseを返さない場合、新しいPromiseメソッドを介して提供できます。ただし、上記の答えはそれほど冗長ではありません。

async function getBody(url) {
  const options = {
    url: url,
    method: 'GET',
  };

  // Return new promise
  return new Promise(function(resolve, reject) {
    // Do async job
    request.get(options, function(err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(body);
      }
    })
  })
}
12
user3520261

async/awaitで動作するようになりました。関数promisifiedRequestにラップして、リクエストpromiseを実行し、callbackおよびerrorに基づいて解決または拒否するresponseを返します。

const request = require('request');

const promisifiedRequest = function(options) {
  return new Promise((resolve,reject) => {
    request(options, (error, response, body) => {
      if (response) {
        return resolve(response);
      }
      if (error) {
        return reject(error);
      }
    });
  });
};

(async function() {
  const options = {
    url: 'https://www.google.com',
    method: 'GET',
    gzip: true,
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'
    }
  };

  let response = await promisifiedRequest(options);

  console.log(response.headers);
  console.log(response.body);
})();
0
cbdev420