私のプログラムでは、別の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.body
はkey=value&...
のようで、レスポンスボディは不要です。
私が間違っているのは何ですか?直し方? request
の適切なasync
の使用法、またはここで述べたようなプロミスでのみ正常に動作します: ノード要求モジュールでawaitが動作しないのはなぜですか ?次の記事では、それが可能であると述べています: Node.jsで非同期待機をマスターする 。
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);
次のこともできることを確認してください。必要なものがデフォルトで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);
}
})
})
}
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);
})();