65

私はnodejsが初めてです。例 1 では応答が見られませんが、例 2 では表示されます。なぜですか? 他の場所では、babel を使用して 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 は他の場所で動作します。私は es6 および es7 機能に必要なモジュールとバベルを使用しています。たとえば、 await は squelize 呼び出しで動作することを検証しました。ただし、リクエスト呼び出しでは機能しません。なんで?

4

4 に答える 4

189

awaitPromise を返すものだけを使用する必要があります。asyncと の作業を開始する前に、 Promises を読むことをお勧めしますawaitrequest次のように、promise を返すように独自のラッパー関数を作成することで、この例を機能させることができます。

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();

編集: または、通常のリクエスト モジュールの代わりに、promise ベースのリクエスト ライブラリの使用を検討することもできます。

于 2016-07-18T03:11:33.190 に答える
22

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)
        })
    })
于 2016-11-11T16:38:19.447 に答える
17

@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

于 2019-02-13T10:01:13.847 に答える
2

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

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

于 2018-09-26T05:35:04.130 に答える