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

IT技术 javascript node.js http get request
2021-03-13 10:44:53

我试图让我的函数返回 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);
}
6个回答

当然您的日志返回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();
如何获取响应的 HTTP 响应代码(200 或 404 等)?是否有关于关键字“on”(response.on)、“data”和“end”的文档?这些是关键词吗?这里似乎什么都没有:nodejs.org/api/http.html#http_class_http_serverresponse
2021-04-18 10:44:53
但这会使代码变得混乱!为什么 javascript 是这样设计的?
2021-04-28 10:44:53
@Daniel 现在有处理异步事件模型的工具:Promises 和 async/await。
2021-04-28 10:44:53
我建议将块推送到数组中,然后最后使用 join('') 。如果有大量数据,这将避免出现问题
2021-05-05 10:44:53
@TylerDurdenstatusCode是响应对象的一个​​属性。我也找不到该ServerResponse对象的正确文档,只是文档中的getrequest方法示例
2021-05-11 10:44:53

使用节点的 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();
    });
}
借调了@AltieresdeMatos 的评论。这是一个很好的、完整的、实用的例子,实际上回答了所述的原始问题。我认为这应该是公认的答案(2021 年)。谢谢朋友。
2021-04-19 10:44:53
谢谢分享!!这是不使用 console.log 返回数据的唯一示例。
2021-04-20 10:44:53

使用 http.get 的简短示例:

require('http').get('http://httpbin.org/ip', (res) => {
    res.setEncoding('utf8');
    res.on('data', function (body) {
        console.log(body);
    });
});
警告:我认为“数据”可以提供部分更新,“响应”事件更实用。
2021-04-18 10:44:53
这个例子很短,你可以得到并且仍然可以运行。这假设一个好的 url 和小的响应。我更喜欢将数据响应分块、使用响应end事件和使用请求errror事件的 http 示例
2021-04-25 10:44:53
鉴于提出的问题,这个答案是断章取义的。除此之外,error event 如果在请求正在进行时连接丢失或在传输过程中发生任何其他问题,您不会显式侦听将触发的事件。
2021-05-11 10:44:53

来自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() 是如何工作得很好而且很简单。优秀的!
2021-05-02 10:44:53
警告:我认为 'data' 可以提供部分更新,'response' 事件更实用
2021-05-09 10:44:53

来自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)
    }))
})