wake-up-neo.com

Wo ist body in einer Antwort von nodejs http.get?

Ich lese die Dokumente unter http://nodejs.org/docs/v0.4.0/api/http.html#http.request , aber aus irgendeinem Grund kann ich die nicht finden body/data-Attribut für das zurückgegebene, abgeschlossene Antwortobjekt. 

> var res = http.get({Host:'www.somesite.com', path:'/'})

> res.finished
true

> res._hasBody
true

Es ist fertig (http.get erledigt das für Sie), es sollte also einen Inhalt haben. Aber es gibt keinen Körper, keine Daten, und ich kann nicht daraus lesen. Wo versteckt sich der Körper?

160
mikemaccana

Bearbeiten: Selbst 6 Jahre später antworten

Das await Schlüsselwort ist der beste Weg, dies zu umgehen, Callbacks und .then() zu vermeiden.

Sie müssen auch einen HTTP-Client verwenden, der Promises zurückgibt.http.get() gibt immer noch ein Request-Objekt zurück, damit es nicht funktioniert. Sie könnten fetch verwenden, aber superagent ist ein ausgereifter HTTP-Client, der über vernünftigere Standardwerte verfügt, darunter eine einfachere Abfragecodierung, die korrekte Verwendung von MIME-Typen, standardmäßig JSON und andere gebräuchliche HTTP-Clientfunktionen. await wartet, bis das Promise einen Wert hat - in diesem Fall eine HTTP-Antwort!

const superagent = require('superagent');

(async function(){
  const response = await superagent.get('https://www.google.com')
  console.log(response.text)
})();

Mit waitit geht control einfach in die nächste Zeile über, sobald das von superagent.get() zurückgegebene Versprechen einen Wert hat.

49
mikemaccana

http.request docs enthält ein Beispiel, wie der Hauptteil der Antwort durch die Behandlung eines data-Ereignisses empfangen wird:

var options = {
  Host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

http.get macht dasselbe wie http.request, nur dass req.end() automatisch aufgerufen wird.

var options = {
  Host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  console.log("Got response: " + res.statusCode);

  res.on("data", function(chunk) {
    console.log("BODY: " + chunk);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});
158
yojimbo87

Ich möchte auch hinzufügen, dass der http.ClientResponse, der von http.get() zurückgegeben wird, ein end -Ereignis hat, also hier eine andere Möglichkeit, die Körperantwort zu erhalten:

var options = {
  Host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  var body = '';
  res.on('data', function(chunk) {
    body += chunk;
  });
  res.on('end', function() {
    console.log(body);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
}); 
124
bizi

Wenn Sie .get verwenden möchten, können Sie dies so tun 

http.get(url, function(res){
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        console.log(chunk);
    });

});
11
user969714

Sie müssen der Anforderung einen Listener hinzufügen, da node.js asynchron arbeitet:

request.on('response', function (response) {
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
 });
});
6
Skomski

Das data-Ereignis wird mehrmals mit "Chunks" des Körpers beim Herunterladen und einem end-Ereignis ausgelöst, wenn alle Chunks heruntergeladen wurden.

Mit Node, das Promises unterstützt, habe ich jetzt einen einfachen Wrapper erstellt, um die verketteten Chunks durch ein Promise zurückzugeben:

const httpGet = url => {
  return new Promise((resolve, reject) => {
    http.get(url, res => {
      res.setEncoding('utf8');
      let body = ''; 
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve(body));
    }).on('error', reject);
  });
};

Sie können es von einer asynchronen Funktion aus aufrufen mit:

const body = await httpGet('http://www.somesite.com');
5
nkron

Das Nadelmodul ist auch gut, hier ist ein Beispiel, das das Modul needle verwendet 

var needle = require('needle');

needle.get('http://www.google.com', function(error, response) {
  if (!error && response.statusCode == 200)
    console.log(response.body);
});
1
Thulasiram

Sie können den Hauptteil der Antwort nicht aus dem Rückgabewert von http.get() abrufen.

http.get() gibt kein Antwortobjekt zurück. Das Anforderungsobjekt wird zurückgegeben ( http.clientRequest ). Es gibt also keine Möglichkeit, den Rumpf der Antwort aus dem Rückgabewert von http.get() zu erhalten.

Ich weiß, dass es eine alte Frage ist, aber das Lesen von der Dokumentation, mit der Sie verlinkt haben zeigt, dass dies auch der Fall war, als Sie es veröffentlicht haben.

0
Vince

Eine Portion Kaffee hier:

# My little helper
read_buffer = (buffer, callback) ->
  data = ''
  buffer.on 'readable', -> data += buffer.read().toString()
  buffer.on 'end', -> callback data

# So request looks like
http.get 'http://i.want.some/stuff', (res) ->
  read_buffer res, (response) ->
    # Do some things with your response
    # but don't do that exactly :D
    eval(CoffeeScript.compile response, bare: true)

Und zusammengestellt

var read_buffer;

read_buffer = function(buffer, callback) {
  var data;
  data = '';
  buffer.on('readable', function() {
    return data += buffer.read().toString();
  });
  return buffer.on('end', function() {
    return callback(data);
  });
};

http.get('http://i.want.some/stuff', function(res) {
  return read_buffer(res, function(response) {
    return eval(CoffeeScript.compile(response, {
      bare: true
    }));
  });
});
0
18augst