Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在NodeJS中创建循环,以从API获取逐页数据并保存到文件?(节点,Axios,fs)_Node.js_Loops_Express_Axios_Fs - Fatal编程技术网

Node.js 如何在NodeJS中创建循环,以从API获取逐页数据并保存到文件?(节点,Axios,fs)

Node.js 如何在NodeJS中创建循环,以从API获取逐页数据并保存到文件?(节点,Axios,fs),node.js,loops,express,axios,fs,Node.js,Loops,Express,Axios,Fs,我需要从API获取所有数据。数据以批(页)的形式提供。每个批次都有其页码 我的解决方案: 获取第1页,将其保存到文件中 通过向页码添加+1循环,并将GET请求的结果附加到文件中 在没有错误的情况下继续 当前文件已创建,然后我得到:致命错误:无效标记压缩接近堆限制分配失败-JavaScript堆内存不足 因此,我使用了--max old space size=8192从那时起就没有任何错误。它只是一直在工作,没有结果。文件保持为空 请帮忙 const fs = require('fs'); con

我需要从API获取所有数据。数据以批(页)的形式提供。每个批次都有其页码

我的解决方案:

  • 获取第1页,将其保存到文件中
  • 通过向页码添加+1循环,并将GET请求的结果附加到文件中
  • 在没有错误的情况下继续
  • 当前文件已创建,然后我得到:致命错误:无效标记压缩接近堆限制分配失败-JavaScript堆内存不足

    因此,我使用了
    --max old space size=8192
    从那时起就没有任何错误。它只是一直在工作,没有结果。文件保持为空

    请帮忙

    const fs = require('fs');
    const axios = require('axios');
    const { response } = require('express');
    
    var myWriteStream = fs.createWriteStream(
      '../dev-data/file.json',
      { flags: 'a' },
      { encoding: 'utf8' },
      err => {}
    );
    
    let pageNumber = 1;
    
    // Getting initial batch on Page 1
    
    axios
      .get(`https://api.example.com/?page=${pageNumber}`)
      .then(function (response) {
        var json = JSON.stringify(response.data);
    
    // Saving result to the file
    
        fs.writeFile('../dev-data/declarations_list.json', json, 'utf-8', err => {
        });
    
    // Looping GET + save to the file by adding + 1 to currentPage 
    
        do {
          pageNumber = response.data.page.currentPage + 1;
          axios
            .get(
                `https://api.example.com/?page=${pageNumber}`
            )
            .then(function (response) {
              console.log(`Current page: ${response.data.page.currentPage}`);
              pageNumber = response.data.page.currentPage;
    
              var json = JSON.stringify(response.data);
    
              myWriteStream.write(json);
            })
            .catch(function (error) {
              console.log(error);
            });
    
    // Do while currentPage (no 'error')
    
        } while (response.data.page.currentPage);
      });
    
    更新

    const fs = require('fs');
    const axios = require('axios');
    const { response } = require('express');
    
    let pageNumber = 0;
    
    do {
      pageNumber = pageNumber + 1;
      console.log(pageNumber);
      axios
        .get(`https://public-api.nazk.gov.ua/v1/declaration/?page=${pageNumber}`)
        .then(function (response) {
          console.log(response);
          console.log(`Current page: ${response.data.page.currentPage}`);
          pageNumber = response.data.page.currentPage;
          var json = JSON.stringify(response.data);
          fs.appendFileSync('../dev-data/declarations_list.json', json);
        })
        .catch(function (error) {
          console.log(error);
        });
      
    } while (pageNumber < 15000);
    
    const fs=require('fs');
    const axios=require('axios');
    const{response}=require('express');
    让pageNumber=0;
    做{
    页码=页码+1;
    控制台日志(页码);
    axios
    .得到(`https://public-api.nazk.gov.ua/v1/declaration/?page=${pageNumber}`)
    .然后(功能(响应){
    控制台日志(响应);
    log(`currentPage:${response.data.page.currentPage}`);
    pageNumber=response.data.page.currentPage;
    var json=json.stringify(response.data);
    appendFileSync('../dev data/declarations_list.json',json);
    })
    .catch(函数(错误){
    console.log(错误);
    });
    }而(页码<15000);
    
    这没有经过测试(因为缺少api访问),但我会尝试在每次加载新页面时写入该文件,基本上如下所示:

    const fs = require('fs');
    const axios = require('axios');
    const { response } = require('express');
    
    let pageNumber = 0;
    var stream = fs.createWriteStream('../dev-data/declarations_list.json', {flags:'a'});
    
    do {
      pageNumber = ++;
      axios
        .get(
            `https://api.example.com/?page=${pageNumber}`
        )
        .then(function (response) {
          console.log(`Current page: ${response.data.page.currentPage}`);
          pageNumber = response.data.page.currentPage;
          var json = JSON.stringify(response.data);
          stream.write(json);
        })
        .catch(function (error) {
          console.log(error);
        });
        // Do while currentPage (no 'error')
    } while (pageNumber < <total_number_of_pages>);
    
    stream.end();
    
    const fs=require('fs');
    const axios=require('axios');
    const{response}=require('express');
    让pageNumber=0;
    var stream=fs.createWriteStream('../dev data/declarations_list.json',{flags:'a'});
    做{
    页码=++;
    axios
    .得到(
    `https://api.example.com/?page=${pageNumber}`
    )
    .然后(功能(响应){
    log(`currentPage:${response.data.page.currentPage}`);
    pageNumber=response.data.page.currentPage;
    var json=json.stringify(response.data);
    stream.write(json);
    })
    .catch(函数(错误){
    console.log(错误);
    });
    //在当前页面时执行(无“错误”)
    }而(页码<);
    stream.end();
    
    也不要嵌套这些axios调用。没有必要这样做,这可能会产生一些问题。 然而,我认为最大的问题是你写那条流的方式

    除此之外,如果没有错误,循环就永远不会结束。您需要提供要检索的总页数


    在我看来,如果您对此没有太多经验,那么您可以先查找类似“Nodejs和Express将JSON响应保存到文件”的内容,然后再继续…

    非常感谢!这是一个巨大的飞跃。我已经发布了真正的更新代码。现在错误是:error:connectenfile-Local(未定义:未定义)。正如我从日志中看到的,它首先抛出15000个数字,然后抛出带有错误的响应。我想我需要弄清楚如何一步一步地运行这个循环。啊,好的。那你就需要一条小溪了。我没有预料到,您会得到那么多响应,但过了一段时间,您的系统可能超过了文件句柄的限制。有关使用流的解决方案,请参见。