node.js - coffee - js to coff
¿Dónde está el cuerpo en la respuesta http.get de un nodo? (9)
Estoy leyendo los documentos en http://nodejs.org/docs/v0.4.0/api/http.html#http.request , pero por alguna razón, parece que no puedo encontrar realmente el atributo cuerpo / datos en el objeto de respuesta devuelto y terminado.
coffee> res = http.get({host:''www.somesite.com'',path:''/''})
coffee> res.finished
true
coffee> res._hasBody
true
Está terminado (http.get lo hace por usted), por lo que debería tener algún tipo de contenido. Pero no hay cuerpo, no hay datos, y no puedo leer de él. ¿Dónde se esconde el cuerpo?
Editar: respondiendo a sí mismo 6 años después
La palabra clave .then()
es la mejor manera de manejar esto, evitando callbacks y .then()
También necesitarás usar un cliente HTTP que devuelva Promises. http.get()
aún devuelve un objeto Request, por lo que no funcionará. Podría usar fetch
, pero el superagent
es un cliente HTTP maduro que presenta valores predeterminados más razonables, incluida la codificación de cadena de consulta simple, el uso adecuado de tipos de mime, JSON de forma predeterminada y otras características comunes del cliente HTTP. await
esperará hasta que la promesa tenga un valor, en este caso, una respuesta HTTP.
const superagent = require(''superagent'');
(async function(){
const response = await superagent.get(''https://www.google.com'')
console.log(response.text)
})();
Con await, el control simplemente pasa a la siguiente línea una vez que la promesa devuelta por superagent.get()
tiene un valor.
El evento de data
se dispara varias veces con ''trozos'' del cuerpo a medida que se descargan y un evento end
cuando se han descargado todos los trozos.
Con Nodo apoyando Promises ahora, creé un contenedor simple para devolver los fragmentos concatenados a través de una Promesa:
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);
});
};
Puede llamarlo desde una función asíncrona con:
const body = await httpGet(''http://www.somesite.com'');
El módulo de aguja también es bueno, aquí hay un ejemplo que usa un módulo de needle
var needle = require(''needle'');
needle.get(''http://www.google.com'', function(error, response) {
if (!error && response.statusCode == 200)
console.log(response.body);
});
Necesita agregar un detector a la solicitud porque node.js funciona asíncrono de esa manera:
request.on(''response'', function (response) {
response.on(''data'', function (chunk) {
console.log(''BODY: '' + chunk);
});
});
No puede obtener el cuerpo de la respuesta del valor de retorno de http.get()
.
http.get()
no devuelve un objeto de respuesta. Devuelve el objeto de solicitud ( http.clientRequest
). Por lo tanto, no hay ninguna forma de obtener el cuerpo de la respuesta del valor de retorno de http.get()
.
Sé que es una vieja pregunta, pero leer la documentación con la que me vinculó muestra que este fue el caso incluso cuando lo publicaste.
Si quieres usar .get puedes hacerlo así
http.get(url, function(res){
res.setEncoding(''utf8'');
res.on(''data'', function(chunk){
console.log(chunk);
});
});
También quiero agregar que http.ClientResponse
devuelto por http.get()
tiene un evento end
, así que aquí hay otra forma en que recibo la respuesta del cuerpo:
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);
});
Una porción de café aquí:
# 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)
Y compilado
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
}));
});
});
http.request docs contiene un ejemplo de cómo recibir el cuerpo de la respuesta mediante el manejo de data
eventos:
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 hace lo mismo que http.request excepto que llama a req.end()
automáticamente.
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);
});