如何解决如何在NodeJS中创建循环以从API获取逐页数据并将其保存到文件? 节点,Axios,fs
我需要从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);
解决方法
这未经测试(由于缺少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();
也不要嵌套这些axios调用。无需这样做,可能会引起一些问题。 但是,我认为最大的问题是您写入该流的方式。
除此之外,如果没有错误,则循环永远不会结束。您将需要提供要检索的页面总数。
在我看来,如果您对此没有足够的经验,那么您可能会首先查找“ Nodejs和Express将JSON响应保存到文件”之类的内容,然后再进行其他操作...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。