如何从 Node.js http get 请求中获取数据
Posted
技术标签:
【中文标题】如何从 Node.js http get 请求中获取数据【英文标题】:How to get data out of a Node.js http get request 【发布时间】:2013-11-01 14:15:02 【问题描述】:我试图让我的函数返回 http get 请求,但是,无论我做什么,它似乎都迷失在了 ?scope? 中。我是 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);
【问题讨论】:
【参考方案1】:来自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)
))
)
【讨论】:
【参考方案2】:我认为现在回答这个问题为时已晚,但我最近遇到了同样的问题,我的用例是调用分页 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请求。【参考方案3】:
使用节点的 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();
);
【讨论】:
感谢分享!!这是没有使用 console.log 就返回数据的唯一示例。 第二次回复@AltieresdeMatos 的评论。这是一个很好的、完整的、实用的例子,它实际上回答了原来的问题。我认为这应该是公认的答案(2021 年)。谢谢朋友。【参考方案4】:当然,您的日志返回 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();
【讨论】:
我建议将块推送到数组中,然后最后使用 join('')。如果有大量数据,这将避免问题 如何获取响应的 HTTP 响应码(200 或 404 等)?是否有关于关键字“on”(response.on)、“data”和“end”的文档?这些是关键字吗?这里似乎什么都没有:nodejs.org/api/http.html#http_class_http_serverresponse @TylerDurdenstatusCode
是响应对象的属性。我也找不到ServerResponse
对象的正确文档,只是get
和request
方法的文档中的示例。
但这会使代码变得混乱!为什么javascript会这样设计?
@Daniel 现在有处理异步事件模型的工具:Promises 和 async/await。【参考方案5】:
使用 http.get 的简短示例:
require('http').get('http://httpbin.org/ip', (res) =>
res.setEncoding('utf8');
res.on('data', function (body)
console.log(body);
);
);
【讨论】:
这个例子是尽可能短的并且仍然可以运行。这假设一个好的 url 和小的响应。我更喜欢将数据响应分块的http示例,使用响应end
事件,并使用请求errror
事件。
鉴于所提出的问题,此答案与上下文无关。除此之外,您没有显式监听error event
,如果在请求进行时连接丢失或在传输过程中出现任何其他问题,则会触发该error event
。
警告:我认为'data'可以给出部分更新,'response'事件更实用。【参考方案6】:
这是我的解决方案,尽管可以肯定的是,您可以使用许多模块将对象作为承诺或类似方式提供给您。无论如何,你错过了另一个回调
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!!!
)
【讨论】:
这似乎不起作用,因为 callbackData() 未定义为函数?【参考方案7】:来自learnyounode:
var http = require('http')
http.get(options, function (response)
response.setEncoding('utf8')
response.on('data', console.log)
response.on('error', console.error)
)
'options' 是主机/路径变量
【讨论】:
谢谢,一直在寻找一个简单的例子,我发现的每个例子都向我抛出了六个新概念。这只是说明了 http.get() 是如何工作的又好又简单。太棒了! 警告:我认为'data'可以给出部分更新,'response'事件更实用以上是关于如何从 Node.js http get 请求中获取数据的主要内容,如果未能解决你的问题,请参考以下文章
从 Angular 2 客户端到 Node.js 服务器的 HTTP POST 请求
node.js http.get 在向远程站点发出 5 次请求后挂起
Node.js 应用程序从 GET 请求到 API 接收到空响应
每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?