web-dev-qa-db-ja.com

Node.js http getリクエストからデータを取得する方法

私はhttp getリクエストを返すように関数を取得しようとしていますが、何をしてもスコープ内で迷子になるようです。私は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);
}
67
Daryl Rodrigo

もちろん、ログは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();
104
Denys Séguret

Http.getを使用した短い例:

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

learnyounodeから:

var http = require('http')  

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

「オプション」はホスト/パス変数です

6
ezchx

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)
       }))
     })
6
Elise Chant

これは私の解決策ですが、確かに、オブジェクトを約束または類似のものとして提供する多くのモジュールを使用できます。とにかく、別のコールバックがありませんでした

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!!!
})
1
ackuser

ノードを使用した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();
    });
}
0
smsivaprakaash