【问题标题】:How to get data out of a Node.js http get request如何从 Node.js http get 请求中获取数据
【发布时间】:2013-11-01 14:15:02
【问题描述】:

我试图让我的函数返回 http get 请求,但是,无论我做什么,它似乎都迷失在了 ?scope? 中。我是 Node.js 的新手,所以任何帮助都将不胜感激

function getData(){
  var http = require('http');
  var str = '';

  var options = {
        host: 'www.random.org',
        path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
  };

  callback = function(response) {

        response.on('data', function (chunk) {
              str += chunk;
        });

        response.on('end', function () {
              console.log(str);
        });

        //return str;
  }

  var req = http.request(options, callback).end();

  // These just return undefined and empty
  console.log(req.data);
  console.log(str);
}

【问题讨论】:

    标签: javascript node.js http get request


    【解决方案1】:

    来自learnyounode:

    var http = require('http')
    var bl = require('bl')
    
    http.get(process.argv[2], function (response) {
        response.pipe(bl(function (err, data) {
            if (err)
                return console.error(err)
            data = data.toString()
            console.log(data)
        }))
    })
    

    【讨论】:

      【解决方案2】:

      我认为现在回答这个问题为时已晚,但我最近遇到了同样的问题,我的用例是调用分页 JSON API 并从每个分页中获取所有数据并将其附加到单个数组中。

      const https = require('https');
      const apiUrl = "https://example.com/api/movies/search/?Title=";
      let finaldata = [];
      let someCallBack = function(data){
        finaldata.push(...data);
        console.log(finaldata);
      };
      const getData = function (substr, pageNo=1, someCallBack) {
      
        let actualUrl = apiUrl + `${substr}&page=${pageNo}`;
        let mydata = []
        https.get(actualUrl, (resp) => {
          let data = '';
          resp.on('data', (chunk) => {
              data += chunk;
          });
          resp.on('end', async () => {
              if (JSON.parse(data).total_pages!==null){
                pageNo+=1;
                somCallBack(JSON.parse(data).data);
                await getData(substr, pageNo, someCallBack);
              }
          });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
        });
      }
      
      getData("spiderman", pageNo=1, someCallBack);
      

      就像@ackuser 提到的,我们可以使用其他模块,但在我的用例中,我必须使用节点https。希望这对其他人有所帮助。

      【讨论】:

      • 谢谢老哥,我也遇到了和你一样的情况,可惜我们只能用https发出https请求。
      【解决方案3】:

      使用节点的 Http 请求的简单工作示例。

      const http = require('https')
      
      httprequest().then((data) => {
              const response = {
                  statusCode: 200,
                  body: JSON.stringify(data),
              };
          return response;
      });
      function httprequest() {
           return new Promise((resolve, reject) => {
              const options = {
                  host: 'jsonplaceholder.typicode.com',
                  path: '/todos',
                  port: 443,
                  method: 'GET'
              };
              const req = http.request(options, (res) => {
                if (res.statusCode < 200 || res.statusCode >= 300) {
                      return reject(new Error('statusCode=' + res.statusCode));
                  }
                  var body = [];
                  res.on('data', function(chunk) {
                      body.push(chunk);
                  });
                  res.on('end', function() {
                      try {
                          body = JSON.parse(Buffer.concat(body).toString());
                      } catch(e) {
                          reject(e);
                      }
                      resolve(body);
                  });
              });
              req.on('error', (e) => {
                reject(e.message);
              });
              // send the request
             req.end();
          });
      }
      

      【讨论】:

      • 感谢分享!!这是没有使用 console.log 就返回数据的唯一示例。
      • 第二次回复@AltieresdeMatos 的评论。这是一个很好的、完整的、实用的例子,它实际上回答了原来的问题。我认为这应该是公认的答案(2021 年)。谢谢朋友。
      【解决方案4】:

      当然,您的日志返回 undefined :您在请求完成之前登录。问题不在于范围,而在于异步性

      http.request 是异步的,这就是为什么它需要一个回调作为参数。在回调中做你必须做的事情(你传递给response.end的那个):

      callback = function(response) {
      
        response.on('data', function (chunk) {
          str += chunk;
        });
      
        response.on('end', function () {
          console.log(req.data);
          console.log(str);
          // your code here if you want to use the results !
        });
      }
      
      var req = http.request(options, callback).end();
      

      【讨论】:

      • 我建议将块推送到数组中,然后最后使用 join('')。如果有大量数据,这将避免问题
      • 如何获取响应的 HTTP 响应码(200 或 404 等)?是否有关于关键字“on”(response.on)、“data”和“end”的文档?这些是关键字吗?这里似乎什么都没有:nodejs.org/api/http.html#http_class_http_serverresponse
      • @TylerDurden statusCode 是响应对象的属性。我也找不到ServerResponse 对象的正确文档,只是getrequest 方法的文档中的示例。
      • 但这会使代码变得混乱!为什么javascript会这样设计?
      • @Daniel 现在有处理异步事件模型的工具:Promises 和 async/await。
      【解决方案5】:

      使用 http.get 的简短示例:

      require('http').get('http://httpbin.org/ip', (res) => {
          res.setEncoding('utf8');
          res.on('data', function (body) {
              console.log(body);
          });
      });
      

      【讨论】:

      • 这个例子是尽可能短的并且仍然可以运行。这假设一个好的 url 和小的响应。我更喜欢将数据响应分块的http示例,使用响应end事件,并使用请求errror事件。
      • 鉴于所提出的问题,此答案与上下文无关。除此之外,您没有显式监听error event ,如果在请求进行时连接丢失或在传输过程中出现任何其他问题,则会触发该error event
      • 警告:我认为'data'可以给出部分更新,'response'事件更实用。
      【解决方案6】:

      这是我的解决方案,尽管可以肯定的是,您可以使用许多模块将对象作为承诺或类似方式提供给您。无论如何,你错过了另一个回调

      function getData(callbackData){
        var http = require('http');
        var str = '';
      
        var options = {
              host: 'www.random.org',
              path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        };
      
        callback = function(response) {
      
              response.on('data', function (chunk) {
                    str += chunk;
              });
      
              response.on('end', function () {
                    console.log(str);
                callbackData(str);
              });
      
              //return str;
        }
      
        var req = http.request(options, callback).end();
      
        // These just return undefined and empty
        console.log(req.data);
        console.log(str);
      }
      

      别处

      getData(function(data){
      // YOUR CODE HERE!!!
      })
      

      【讨论】:

      • 这似乎不起作用,因为 callbackData() 未定义为函数?
      【解决方案7】:

      来自learnyounode:

      var http = require('http')  
      
      http.get(options, function (response) {  
        response.setEncoding('utf8')  
        response.on('data', console.log)  
        response.on('error', console.error)  
      })
      

      'options' 是主机/路径变量

      【讨论】:

      • 谢谢,一直在寻找一个简单的例子,我发现的每个例子都向我抛出了六个新概念。这只是说明了 http.get() 是如何工作的又好又简单。太棒了!
      • 警告:我认为'data'可以给出部分更新,'response'事件更实用
      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多