【问题标题】:nodejs http.request how to collect datanodejs http.request 如何收集数据
【发布时间】:2018-12-09 17:03:00
【问题描述】:

我试图在一种方法中调用一个 rest API URL,然后使用该响应来形成对另一个 URL 的下一个查询,比如说 git 来查询一些信息。 在发布此之前,我已经看过很多示例,每个人都只是将响应打印到控制台或将其设置为服务器响应。

我尝试过使用 async/await,但它只会让整个事情变得非常缓慢。所以,我不太热衷于使用这种方法。

我正在执行回调,但我无法收集数据以实际循环它。 这是我的代码 sn-p:-

function initialize(path) {
    // Setting URL and headers for request
    var options = {
        url: '',
        headers: {
            'Accept': '*/*',
            'User-Agent' : 'something something',
            'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
         },
         method: 'GET',
         port:443
    };
    options.url =  path;
    callback = function(err,response){
        var str= "";
        response.on('data',function(chunk){
            str+=chunk;
        });
        response.on('end',function(){
            return JSON.parse(str);
        });
    }
    http.request(options, callback).end();
}

我从这个方法中调用它。

function collectData1(userid){
    var url = "example.com/users/user1";
    var results = initialize(url);
    console.log(results);
    return results;
}

但结果始终未定义。

那么,我该怎么做呢?有什么建议吗?

【问题讨论】:

  • 回调函数是否被触发了?
  • 现在开始收到了。 events.js:136 throw er; // Unhandled 'error' event ^ Error: connect ECONNREFUSED 127.0.0.1:80 at Object._errnoException (util.js:1031:13) at _exceptionWithHostPort (util.js:1052:20) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1195:14)
  • 解决了端口问题。我想我正在寻找的是 http.request 或 request.get 的一个很好的例子。而且我没有找到一个体面的例子,结果不是直接返回到 html 或 html 模板,而不对数据本身做任何事情。

标签: javascript node.js http callback http-get


【解决方案1】:
function initialize(path, callback) {
// Setting URL and headers for request
var options = {
    host: "example.com"
    path: "/users/user1",
    headers: {
        'Accept': '*/*',
        'User-Agent': 'something something',
        'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
    },
    method: 'GET',
    port: 80
};

http.request(options, function (response) {
    response.setEncoding('utf8');
    var str = "";
    response.on('data', function (chunk) {
        str += chunk;
    });
    response.on('end', function () {
        callback(JSON.parse(str));
    });
}).end();
}

function collectData1(userid) {
    var url = "example.com/users/user1";
    initialize(url, function (result) {
        console.log(results);
        return results;
    });
}

修改了代码
在请求中添加 response.setEncoding('utf8')
http请求在80端口,https请求在443
参考http request docs

【讨论】:

  • 使用您建议的代码,我收到此错误。 TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string or Buffer. Received type object
  • 检查此代码。我已经测试了自己并且正在工作
【解决方案2】:

我可以建议三种方法;

  1. Promises
  2. Async / Await(你已经试过了)
  3. Callback Functions(这是最古老的方式。实际上我不建议这样做:))

否则你不能直接从异步函数返回值。

编辑:

var http = require('http');

function initialize(path) {
    return new Promise(function (resolve, reject) {

        // Setting URL and headers for request
        var options = {
            hostname: "jsonplaceholder.typicode.com",
            path: path,
            // port:443,
            headers: {
                'Accept': '*/*',
                'User-Agent': 'something something',
                'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
            },
            method: 'GET',

        };

        var callback = function (response) {


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

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

            request.on("error", function (error) {
                reject(error);
            })
        };

        var request = http.request(options, callback)
        request.on("error", function (error) {
            reject(error);
        });

        request.end();
    })
}

function collectData(userid) {
    var url = "/posts/" + userid;
    return initialize(url);
}


http.createServer(function (req, res) {


    collectData(1).then(function (data) {
        res.write(data);
        res.end();

    }).catch(function (error) {

        res.write(error.message);
        res.end();
    })


}).listen(8080);

【讨论】:

  • 如何在没有 async/await 的情况下使用 Promise。你能在这里发布一些示例代码吗?回调.then() 没有及时返回值供我处理。而且我一直不确定,因此我不得不到处等待。
  • 所以,这就是我不想做的事情,无论我从承诺中得到什么,我不只是想把它发送到我的显示器上,我需要处理它,(过滤掉一些值,或使用此响应提出我的下一个请求)。你会怎么做?
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2014-05-02
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多