Bluebirdの約束は少し魔法であり、request
はかなり混乱です(メソッドを持つオブジェクトとして動作する関数です)。
具体的なシナリオは非常に単純です。Cookiejarを使用して、Cookieを有効にしたリクエストインスタンスがあります(request
のグローバルCookieハンドラーは使用しません)。どうすればそれを効果的に約束できますか?また、それがサポートするすべての方法は?
理想的には、私はできることをしたいです:
request(url)
-> Promiserequest.getAsync(url)
-> Promiserequest.postAsync(url, {})
-> PromisePromise.promisifyAll(request)
は効果がないようです(「postAsyncは定義されていません」と表示されているため)。
以下が動作するはずです:
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
)を無視することです。
request-promise モジュールを使用できます。
世界的に有名なHTTPクライアント「Request」がPromises/A +に準拠しました。ブルーバードを搭載。
モジュールをインストールすると、promiseスタイルでリクエストを使用できます。
npm install request-promise
3番目のコールバックパラメーターbody
は必要ないことに注意してください。 response
パラメーターにも存在します。 ソースをチェック の場合、body
はresponse.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
プロパティはありません。
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
}