代码之家  ›  专栏  ›  技术社区  ›  Majid Abdolhosseini

使用异步/等待语法的nodejs http请求[重复]

  •  0
  • Majid Abdolhosseini  · 技术社区  · 7 年前

    async 从另一个API模块调用我的函数:

    var info = await api.MyRequest(value);
    

    var request = require("request")
    
    module.exports.MyRequest = async function MyRequest(value) {
        var options = {
            uri: "http://some_url",
            method: "GET",
            qs: {  // Query string like ?key=value&...
                key : value
            },
            json: true
        }
    
        try {
            var result = await request(options);
            return result;
        } catch (err) {
            console.error(err);
        }
    }
    

    然而,执行立即返回 result 因此 info 包含请求对象和请求正文- info.body 喜欢 key=value&... ,不是必需的响应主体。

    request 与一起使用 Why await is not working for node request module ? 以下文章提到有可能: Mastering Async Await in Node.js

    1 回复  |  直到 8 年前
        1
  •  69
  •   jfriend00    5 年前

    你需要使用 request-promise 模块,而不是 request http.request() .

    await 请求

    这个 请求 .then() 等待 请求 模块需要。

    request-promise module 然后改变这个:

    var request = require("request");
    

    对此:

    const request = require("request-promise");
    

    然后,你可以做:

    var result = await request(options);
    

    在维护模式下编辑Jan,2020-request()模块

    仅供参考 模及其导数 请求承诺 here this table 每一个都有一些讨论。

    我一直在用 got() 我自己和它从一开始就使用承诺,支持许多与 request() 模块,编程简单。

        2
  •  26
  •   user3520261    8 年前

    async function getBody(url) {
      const options = {
        url: url,
        method: 'GET',
      };
    
      // Return new promise
      return new Promise(function(resolve, reject) {
        // Do async job
        request.get(options, function(err, resp, body) {
          if (err) {
            reject(err);
          } else {
            resolve(body);
          }
        })
      })
    }
        3
  •  10
  •   cbdeveloper    7 年前

    我只是设法让它工作 异步/等待 . 我把它包装在一个函数里 promisifiedRequest promise callback error response

    const request = require('request');
    
    const promisifiedRequest = function(options) {
      return new Promise((resolve,reject) => {
        request(options, (error, response, body) => {
          if (response) {
            return resolve(response);
          }
          if (error) {
            return reject(error);
          }
        });
      });
    };
    
    (async function() {
      const options = {
        url: 'https://www.google.com',
        method: 'GET',
        gzip: true,
        headers: {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'
        }
      };
    
      let response = await promisifiedRequest(options);
    
      console.log(response.headers);
      console.log(response.body);
    })();
    
        4
  •  5
  •   matfax    5 年前

    request-promise request 包裹。 got 已经提到了,但它取决于11个其他包。 axios 相反,只有1个依赖项(用于重定向)。其他一切都是在本机NodeJS包之上本机实现和构建的。

    下面是使用 axios

    const axios = require('axios')
    
    const response = await axios.get(url)
    const result = response.data
    

    字体中的一行:

    const {data} = await axios.get(url)