如何从 Node.js http get 请求中获取数据

Posted

技术标签:

【中文标题】如何从 Node.js http get 请求中获取数据【英文标题】:How to get data out of a Node.js http get request 【发布时间】: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);

【问题讨论】:

【参考方案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'事件更实用

以上是关于如何从 Node.js http get 请求中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Node.js——request/get实现评论功能

从 Angular 2 客户端到 Node.js 服务器的 HTTP POST 请求

node.js http.get 在向远程站点发出 5 次请求后挂起

Node.js 应用程序从 GET 请求到 API 接收到空响应

每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?

如何从 Node.js 中的 URL 请求