Я пытаюсь заставить свою функцию возвращать HTTP-запрос на получение, однако, что бы я ни делал, кажется, что он теряется в «области действия». Я ухожу новичком в 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);
}
statusCode
- это свойство объекта ответа. Я не мог найти надлежащую документацию дляServerResponse
объекта либо, только примеров в документации дляget
иrequest
методов.Более короткий пример с использованием http.get:
require('http').get('http://httpbin.org/ip', (res) => { res.setEncoding('utf8'); res.on('data', function (body) { console.log(body); }); });
источник
end
событие ответа и используютerrror
событие запроса .error event
который будет срабатывать, если соединение будет потеряно во время выполнения запроса или если во время передачи возникнут какие-либо другие проблемы.Простой рабочий пример 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(); }); }
источник
от Learnyounode:
var http = require('http') http.get(options, function (response) { response.setEncoding('utf8') response.on('data', console.log) response.on('error', console.error) })
'options' - это переменная хоста / пути
источник
от 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) })) })
источник
Это мое решение, хотя вы наверняка можете использовать множество модулей, которые передают вам объект как обещание или что-то подобное. В любом случае, вам не хватало другого обратного вызова
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!!! })
источник
Я думаю, что уже слишком поздно отвечать на этот вопрос, но недавно я столкнулся с той же проблемой. Мой вариант использования заключался в вызове разбитого на страницы JSON API и получении всех данных из каждой разбивки на страницы и добавлении их в один массив.
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);
Как упомянул @ackuser, мы можем использовать другой модуль, но в моем случае мне пришлось использовать узел
https
. Надеясь, что это поможет другим.источник
https
для выдачи https-запроса.