web-dev-qa-db-ja.com

どのようにリクエストを適切に約束しますか?

Bluebirdの約束は少し魔法であり、requestはかなり混乱です(メソッドを持つオブジェクトとして動作する関数です)。

具体的なシナリオは非常に単純です。Cookiejarを使用して、Cookieを有効にしたリクエストインスタンスがあります(requestのグローバルCookieハンドラーは使用しません)。どうすればそれを効果的に約束できますか?また、それがサポートするすべての方法は?

理想的には、私はできることをしたいです:

  • call request(url)-> Promise
  • call request.getAsync(url)-> Promise
  • call request.postAsync(url, {})-> Promise

Promise.promisifyAll(request)は効果がないようです(「postAsyncは定義されていません」と表示されているため)。

31
Madara Uchiha

以下が動作するはずです:

var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);

これは、requestが事前にわからないため、promisificationがプロトタイプメソッドで機能するため、thisは無料の関数ではないことに注意してください。 bluebirdの新しいバージョンでのみ動作します。リクエストオブジェクトにCookieをフォークするときに必要な場合に繰り返します。


Bluebird v3を使用している場合は、multiArgsオプションを使用する必要があります。

var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})

これは、リクエストのコールバックが(err, response, body):Bluebird v3のデフォルトの動作は、最初の成功値引数(つまりresponse)のみを取り、他の引数(body)を無視することです。

38

request-promise モジュールを使用できます。

世界的に有名なHTTPクライアント「Request」がPromises/A +に準拠しました。ブルーバードを搭載。

モジュールをインストールすると、promiseスタイルでリクエストを使用できます。

npm install request-promise
33

3番目のコールバックパラメーターbodyは必要ないことに注意してください。 responseパラメーターにも存在します。 ソースをチェック の場合、bodyresponse.body。それらは常に同じであることが保証されています。

これは、このページの他の回答で説明されている単純な約束がすべての応答データを取得するのに十分であることを意味します。

const request = require('request')
const { promisify } = require('util')
const rp = promisify(request)

rp('https://example.com').then(({body, statusCode}) => ...)

これは、コールバック/約束に渡されるresponseにのみ当てはまります。応答に渡されるresponseオブジェクトeventは標準のhttp.IncomingMessageおよびそのようなものとしてbodyプロパティはありません。

4
Tamlyn

Node.js v11.10.に基づいてutilベースで例を示します

import { get, post } from "request";
import { promisify } from "util";

const [getAsync, postAsync] = [get, post].map(promisify);


getAsync("http://stackoverflow.com")
    .then(({statusCode, body}) => { 
       //do something 
     });

または、同等にasync/awaitを使用します:

const foo = async () => {
    const {statusCode, body} = await getAsync("http://stackoverflow.com")
    // do something
}
3
Little Roys