wake-up-neo.com

Warum funktioniert waitit nicht für das Knotenanforderungsmodul?

Ich bin neu bei nodejs. Ich sehe die Antwort nicht in Ex 1, aber ich sehe in Ex 2. Warum? Await arbeitet für mich an anderen Orten mit Babel.

Ex 1

 let res = await request(url)
 console.log(res);
 console.log(res.body);

Ex 2

request(url, function (error, res, body) {
 if (!error && response.statusCode == 200) {
 console.log(body) 
 }
});

Warten Sie auf andere Orte. Ich benutze Babel und benötige Module für es6 und es7 Zum Beispiel erwarten Arbeiten in Squelize-Aufruf, die ich validiert habe. Es funktioniert jedoch nicht für den Aufruf von Anfragen. Warum?

27
user43286

Sie sollten nur await auf etwas setzen, das ein Versprechen zurückgibt. Ich würde auf jeden Fall empfehlen, sich über Promises zu informieren, bevor Sie mit async und await arbeiten. Sie können dieses Beispiel wahrscheinlich zum Laufen bringen, indem Sie eine eigene Wrapper-Funktion um request erstellen, um ein Versprechen zurückzugeben, z. B. so:

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

Bearbeiten: Alternativ können Sie auch mit request-promise anstelle des regulären Anforderungsmoduls nachschauen.

71
saadq

ES6

Verwendung: Wo requestrequire('./await-request') ist

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)
    }
}

Code:

// request-service.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)
        })
    })
15
dimpiax

Wie @saadq sagt, können Sie nur auf Funktionen warten, die Promise zurückgeben.

Ich benutze gerne das Node.js util-Paket, um eine Funktion mit Callback zu versprechen. util + request kann also so verwendet werden:

const util = require('util')
const request = require("request");

const requestPromise = util.promisify(request);
const response = await requestPromise(url);
console.log('response', response.body);

Demo: https://runkit.com/mhmtztmr/node-js-request-with-async-await

0
mhmtztmr

Versuchen Sie es mit dem folgenden NPM-Paket

Node-Fetch

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

Hoffe, es funktioniert.

0
Piyush Bansal