web-dev-qa-db-ja.com

ノード要求モジュールで待機が機能しないのはなぜですか?

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呼び出しで機能し、検証済みです。ただし、リクエストコールでは機能しません。どうして?

35
user43286

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 を使用して調べることもできます。

95
saadq

ES6

使用法:ここで、requestrequire('./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)
        })
    })
16
dimpiax

@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

4
moztemur

次の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);
          }

それがうまくいくことを願っています。

1
Piyush Bansal