在 node.js 中按顺序合并来自多个 GET 请求的数据
Sequentially combine data from multiple GET requests in node.js
我正在编写一个带有 http 模块的 node.js 应用程序,并试图组合来自多个 GET 请求的数据以产生一个结果。我检查了类似的问题,但它们都涉及 async.map
以并行初始化请求。在我的例子中,我需要第一个 GET 请求的结果来为下一个请求获取 URL,等等。这是我正在处理的示例:
// First GET request
https.get('URL', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
let names = parsedData.name;
let before_id = parsedData.messages[99].id;
});
});
然后我想将 names
和 before_id
传递给另一个 GET 请求,如下所示:
// Second GET request
https.get('URL&before_id=' + before_id, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
names = //names from previous request + this parsedData.name
let before_id = parsedData.messages[99].id;
});
});
对于上下文:我正在使用 GroupMe API,它一次只能检索 100 条消息。我想检索 1000 条消息,这是通过找到一批 100 条消息中最后一条消息的消息 ID 并调用另一个 GET 请求,将该消息 ID 作为参数传递到 URL 中来完成的。 (这将请求指定 ID 之前的 100 条消息)。这样我不仅需要将每个请求的 id 传递给下一个请求,而且我还需要从每批请求中存储我需要的数据,将它们组合起来,然后一起为它们提供服务。我该怎么做?
会有比我将在答案中提出的更好的方法来构建代码。但这是你想要做的最简单的例子。
要使用一个异步操作的结果来启动其他任务,您必须将该任务嵌入到异步操作的回调中。
// First GET request
https.get('URL', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
let names = parsedData.name;
let before_id = parsedData.messages[99].id;
// Second GET request
https.get('URL&before_id=' + before_id, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
names = //names from previous request + this parsedData.name
let before_id = parsedData.messages[99].id;
});
});
});
});
您可以尝试声明一个全局变量并在第一个 get 请求中更新它,方法是添加该变量,然后在下一个 get 请求中使用该数据。
let before_id = ''
// First GET request
https.get('URL', (resp) => {
resp.on('data', (chunk) => {
data += chunk;
});
before_id += parsedData.messages[99].id;
//Do other stuff
});
// Second GET request
https.get( 'URL&before_id=' + before_id, (resp)()=>{
//Do stuff
})
我正在编写一个带有 http 模块的 node.js 应用程序,并试图组合来自多个 GET 请求的数据以产生一个结果。我检查了类似的问题,但它们都涉及 async.map
以并行初始化请求。在我的例子中,我需要第一个 GET 请求的结果来为下一个请求获取 URL,等等。这是我正在处理的示例:
// First GET request
https.get('URL', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
let names = parsedData.name;
let before_id = parsedData.messages[99].id;
});
});
然后我想将 names
和 before_id
传递给另一个 GET 请求,如下所示:
// Second GET request
https.get('URL&before_id=' + before_id, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
names = //names from previous request + this parsedData.name
let before_id = parsedData.messages[99].id;
});
});
对于上下文:我正在使用 GroupMe API,它一次只能检索 100 条消息。我想检索 1000 条消息,这是通过找到一批 100 条消息中最后一条消息的消息 ID 并调用另一个 GET 请求,将该消息 ID 作为参数传递到 URL 中来完成的。 (这将请求指定 ID 之前的 100 条消息)。这样我不仅需要将每个请求的 id 传递给下一个请求,而且我还需要从每批请求中存储我需要的数据,将它们组合起来,然后一起为它们提供服务。我该怎么做?
会有比我将在答案中提出的更好的方法来构建代码。但这是你想要做的最简单的例子。
要使用一个异步操作的结果来启动其他任务,您必须将该任务嵌入到异步操作的回调中。
// First GET request
https.get('URL', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
let names = parsedData.name;
let before_id = parsedData.messages[99].id;
// Second GET request
https.get('URL&before_id=' + before_id, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
let parsedData = JSON.parse(data);
names = //names from previous request + this parsedData.name
let before_id = parsedData.messages[99].id;
});
});
});
});
您可以尝试声明一个全局变量并在第一个 get 请求中更新它,方法是添加该变量,然后在下一个 get 请求中使用该数据。
let before_id = ''
// First GET request
https.get('URL', (resp) => {
resp.on('data', (chunk) => {
data += chunk;
});
before_id += parsedData.messages[99].id;
//Do other stuff
});
// Second GET request
https.get( 'URL&before_id=' + before_id, (resp)()=>{
//Do stuff
})