【问题标题】:Sequentially combine data from multiple GET requests in node.js在 node.js 中按顺序组合来自多个 GET 请求的数据
【发布时间】:2021-04-04 17:35:41
【问题描述】:

我正在使用 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;
    });
});

然后我想将 namesbefore_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 传递给下一个请求,而且我还需要存储每批请求中我需要的数据,将它们组合起来,然后一起提供它们。我该怎么做?

【问题讨论】:

    标签: node.js asynchronous get groupme


    【解决方案1】:

    将有比我将在回答中提出的更好的方法来构建代码。但这是你想做的最简单的例子。

    要使用一个异步操作的结果来启动其他任务,您必须将该任务嵌入到异步操作的回调中。

    // 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;
                });
            });
        });
    });
    

    【讨论】:

    • 我确信有更好/更简洁的方法可以做到这一点,但这种方法非常适合我的需要。谢谢!
    【解决方案2】:

    您可以尝试声明一个全局变量并在第一个 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
    })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2011-08-28
      • 2017-12-23
      • 2019-06-08
      • 2023-03-31
      • 2016-03-01
      相关资源
      最近更新 更多