nodejs http.request, как собирать данные - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь вызвать URL API отдыха в одном методе, а затем использовать этот ответ для формирования следующего запроса к другому URL, скажем, git для запроса некоторой информации. Я видел множество примеров, прежде чем опубликовать это, в каждом люди просто распечатывают ответ на консоль или устанавливают его в ответ сервера.

Я пытался использовать async / await, но это просто замедляет процесс. Поэтому я не очень заинтересован в использовании этого подхода.

Я выполняю обратные вызовы, но я не могу собрать данные, чтобы фактически зациклить их. Вот мой фрагмент кода: -

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;
}

Но результаты всегда остаются неопределенными.

Итак, как мне это сделать? Есть предложения?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018
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 запрос документов

0 голосов
/ 01 июля 2018

Есть три способа, которые я могу предложить;

  1. Обещания
  2. Async / Await (который вы уже пробовали)
  3. Функции обратного вызова (это самый старый способ. На самом деле я не советую это :))

В противном случае вы не можете возвращать значения напрямую из асинхронных функций.

Edit:

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);
...