Estoy tratando de que mi función devuelva la solicitud http get, sin embargo, cualquier cosa que haga parece perderse en el? Alcance ?. Soy nuevo en Node.js, por lo que cualquier ayuda sería apreciada
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);
}
statusCode
es una propiedad del objeto de respuesta. Tampoco pude encontrar la documentación adecuada para elServerResponse
objeto, solo ejemplos en los documentos para los métodosget
yrequest
.Ejemplo más corto usando http.get:
require('http').get('http://httpbin.org/ip', (res) => { res.setEncoding('utf8'); res.on('data', function (body) { console.log(body); }); });
fuente
end
evento de respuesta y usan elerrror
evento de solicitud .error event
que se activará si la conexión se pierde mientras la solicitud está en curso o si ocurre algún otro problema durante la transmisión.de learnyounode:
var http = require('http') http.get(options, function (response) { response.setEncoding('utf8') response.on('data', console.log) response.on('error', console.error) })
'opciones' es la variable de host / ruta
fuente
Ejemplo de trabajo simple de solicitud Http usando node.
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(); }); }
fuente
de 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) })) })
fuente
Esta es mi solución, aunque seguro que puedes usar muchos módulos que te dan el objeto como promesa o similar. De todos modos, te faltaba otra devolución de llamada
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); }
en algún otro lugar
getData(function(data){ // YOUR CODE HERE!!! })
fuente
Creo que es demasiado tarde para responder a esta pregunta, pero recientemente enfrenté el mismo problema, mi caso de uso fue llamar a la API JSON paginada y obtener todos los datos de cada paginación y agregarlos a una sola matriz.
const https = require('https'); const apiUrl = "https://example.com/api/movies/search/?Title="; let finaldata = []; let someCallBack = function(data){ finaldata.push(...data); console.log(finaldata); }; const getData = function (substr, pageNo=1, someCallBack) { let actualUrl = apiUrl + `${substr}&page=${pageNo}`; let mydata = [] https.get(actualUrl, (resp) => { let data = ''; resp.on('data', (chunk) => { data += chunk; }); resp.on('end', async () => { if (JSON.parse(data).total_pages!==null){ pageNo+=1; somCallBack(JSON.parse(data).data); await getData(substr, pageNo, someCallBack); } }); }).on("error", (err) => { console.log("Error: " + err.message); }); } getData("spiderman", pageNo=1, someCallBack);
Como mencionó @ackuser, podemos usar otro módulo, pero en mi caso de uso tuve que usar el nodo
https
. Esperando que esto ayude a otros.fuente
https
para emitir una solicitud https.