Nodejsは初めてです。例1では応答が表示されませんが、例2では表示されます。なぜですか? Awaitはバベルを使って他の場所で私のために働いています。
例1
let res = await request(url)
console.log(res);
console.log(res.body);
例2
request(url, function (error, res, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
});
Awaitは他の場所で機能します。私はbabelとes6およびes7機能に必要なモジュールを使用しています。たとえば、awaitはsquelize呼び出しで機能し、検証済みです。ただし、リクエストコールでは機能しません。どうして?
Promiseを返すものに対してのみawait
する必要があります。 async
およびawait
を使用する前に、Promisesを読むことをお勧めします。次のように、request
を囲む独自のラッパー関数を作成してプロミスを返すことで、この例を動作させることができます。
function doRequest(url) {
return new Promise(function (resolve, reject) {
request(url, function (error, res, body) {
if (!error && res.statusCode == 200) {
resolve(body);
} else {
reject(error);
}
});
});
}
// Usage:
async function main() {
let res = await doRequest(url);
console.log(res);
}
main();
編集:または、通常のリクエストモジュールの代わりに request-promise を使用して調べることもできます。
ES6
使用法:ここで、request
はrequire('./await-request')
です
const init = async () => {
try {
const result = await request({
uri: 'statdirectory/exchange?json',
baseUrl: 'https://bank.gov.ua/NBUStatService/v1/',
json: true
})
console.log(result)
}
catch (err) {
console.error(err)
}
}
コード:
// await-request.js
const request = require('request')
module.exports = async (value) =>
new Promise((resolve, reject) => {
request(value, (error, response, data) => {
if(error) reject(error)
else resolve(data)
})
})
@saadqが言うように、Promiseを返す関数のみを「待機」できます。
Node.jsのutil
パッケージを使用して、コールバックで関数を約束するのが好きです。したがって、util
+ request
は次のように使用できます。
const util = require('util')
const request = require("request");
const requestPromise = util.promisify(request);
const response = await requestPromise(url);
console.log('response', response.body);
デモ: https://runkit.com/mhmtztmr/node-js-request-with-async-await
次のNPMパッケージで試してください
var url = "http://www.google.com";
try
{
const response = await fetch(url);
const json = await response.json();
return {message:json.message,status:json.type};
}
catch(error)
{
console.log(error);
}
それがうまくいくことを願っています。