web-dev-qa-db-fra.com

Pourquoi wait ne fonctionne pas pour le module de requête de nœud?

Je suis nouveau sur nodejs. Je ne vois pas la réponse dans l'ex 1, mais je vois dans l'ex 2. Pourquoi? Attendre fonctionne pour moi ailleurs, avec 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) 
 }
});

En attente de travaux dans d'autres endroits, j'utilise babel et les modules requis pour les fonctionnalités es6 et es7. Par exemple, attendre les travaux en appel squelize, j’ai validé. Mais cela ne fonctionne pas pour un appel de requête. Pourquoi?

27
user43286

Vous ne devriez que await sur quelque chose qui retourne une promesse. Je recommanderais certainement de lire sur Promises avant de commencer à travailler avec async et await. Vous pouvez probablement obtenir cet exemple en créant votre propre fonction wrapper autour de request pour lui faire renvoyer une promesse, comme ceci:

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

Edit: Vous pouvez également utiliser request-promise au lieu du module de requête standard.

71
saadq

ES6

Utilisation: request est 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)
    }
}

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

Comme @saadq le dit, vous ne pouvez "attendre" que les fonctions renvoyant Promise.

J'aime utiliser le package util de Node.js pour promouvoir une fonction avec callback. Donc util + request peut être utilisé comme ça:

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

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

Démo: https://runkit.com/mhmtztmr/node-js-request-with-async-await

0
mhmtztmr

Essayez avec le package NPM suivant

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

Esperons que ça marche.

0
Piyush Bansal