Node.js 如何在NodeJS中创建循环,以从API获取逐页数据并保存到文件?(节点,Axios,fs)
我需要从API获取所有数据。数据以批(页)的形式提供。每个批次都有其页码 我的解决方案: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
--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个数字,然后抛出带有错误的响应。我想我需要弄清楚如何一步一步地运行这个循环。啊,好的。那你就需要一条小溪了。我没有预料到,您会得到那么多响应,但过了一段时间,您的系统可能超过了文件句柄的限制。有关使用流的解决方案,请参见。