javascript - 从 Nodejs http get 请求传递数据
问题描述
我正在尝试从 resp.on 函数的 get 请求中传递数据。我想使用 'var url' 发出一个单独的获取请求,我将再次解析数据。我能够从函数内部 console.log 变量但不能返回(或从外部访问)。这似乎是一个范围界定或异步问题。
const https = require('https');
https.get('https://collectionapi.metmuseum.org/public/collection/v1/objects', (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
var json_data = JSON.parse(data);
var total = json_data.total
var random_objectID = Math.floor(Math.random()*total)
var url = 'https://collectionapi.metmuseum.org/public/collection/v1/objects/' + random_objectID
console.log(url);
});
}).on("error", (err) => {
console.log("Error: " + err.message);
})
//'url' becomes unknown here. I want to pass it to another get request.
解决方案
这既是异步问题,也是范围问题!
如果您var url;
在最外层范围内声明,您将能够按预期在该回调内设置它,但由于这是异步发生的,除非您在回调完成后进行检查,否则您将无法使用范围外的值。
或者,您可以将整个事情包装在一个promise中,例如
const https = require('https');
new Promise((resolve,reject)=>{
let targetUrl = 'https://collectionapi.metmuseum.org/public/collection/v1/objects';
https.get(targetUrl,resp=>{
// ...
resp.on('end', () => {
// ...
resolve(url);
});
});
}).then(url=>{
// do stuff with that URL
});
如果您的目标是自动从 Web 资源中获取数据,我建议您查看request 模块,它也有一个 promisified 变体。
推荐阅读
- excel - 在 Excel 中使用过滤表计算/汇总值
- android - 初始化 Android 应用程序的正确方法是什么?
- ms-access - MSO 访问 2013
- python - python和c++上的LinkedList
- amp-html - 用户创建项目的加速移动页面(页面)
- bazel - 使用 --symlink_prefix 查询 bazel 目标的输出目标
- ios - 从文件中检索图像时旋转
- scenekit - 哪种类型的镜头(公式)scenekit 用于计算 scncamera 的视野?
- java - Spark 编码器:何时使用 beans()
- marklogic - Marklogic - 未找到模块 /com.marklogic.hub/dhf.xqy