NodeJS 为什么等待对节点请求模块不起作用?

l3zydbqr  于 2023-02-08  发布在  Node.js
关注(0)|答案(5)|浏览(126)

我是nodejs的新手。我在ex1中没有看到响应,但是我在ex2中看到了。为什么?在其他地方,使用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可以在其他地方工作,我使用babel和es6和es7特性所需的模块。例如,await可以在squelize调用中工作,我验证过了。但是它不能在request调用中工作。为什么?

llew8vvj

llew8vvj1#

你应该只使用await来返回一个承诺。我强烈建议你在开始使用asyncawait之前先阅读一下承诺。你可以通过在request周围创建你自己的 Package 函数来让它返回一个承诺,就像这样:

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() {
  try {
    let response = await doRequest(url);
    console.log(response); // `response` will be whatever you passed to `resolve()` at the top
  } catch (error) {
    console.error(error); // `error` will be whatever you passed to `reject()` at the top
  }
}

main();

编辑:或者,您可以考虑使用基于承诺的请求库,而不是常规的请求模块。

hgc7kmma

hgc7kmma2#

    • 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)
        })
    })
8ftvxx2r

8ftvxx2r3#

正如@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

vpfxa7rd

vpfxa7rd4#

尝试使用以下NPM包
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);
          }

希望能成功。

2guxujil

2guxujil5#

我需要在response.json()中添加await,因为response.json()是promise

( async function(){
      const{default:fetch} = await import('node-fetch');
      try {
        response = await fetch('https://datausa.io/api/data?drilldowns=Nation&measures=Population')  ;
        console.log(await response.json())
      } catch (err) {
        console.log('Http error', err);
      }
    })()

相关问题