gpt4 book ai didi

javascript - 将来自对 REST API 的重复请求的最终 json 写入文件

转载 作者:行者123 更新时间:2023-12-03 01:35:27 25 4
gpt4 key购买 nike

我正在尝试通过重复调用restAPI 来构建一个json 数据文件。最终写入的文件是从所有调用接收到的数据的总和。目前,该文件正在写入第一次调用的内容,然后被第一次+第二次调用的内容覆盖(请参阅下面代码的控制台输出)。

由于我必须进行多次调用,因此一旦代码正常工作,我只想在请求完成并且构建 json 字符串后才写入文件。现在有人知道我该怎么做吗?也许使用回调(?),一旦请求完成或 json 字符串完成构建,我仍然不掌握它。

"use strict";
const fs = require('fs');
const request = require('request');
var parse = require('csv-parse');

const path = "../path tocsv.csv";
const pathJSON = "../pathtoJSON.json";
var shapes = "https://url";

var options = {
url: '',
method: 'GET',
accept: "application/json",
json: true,
};

var csvData = [];
var jsonData = "[";
fs.createReadStream(path)
.pipe(parse({delimiter: ','}))
.on('data', function(data) {
csvData.push(data[1]);
})
.on('end',function() {
var start = Date.now();
var records = csvData.length //2212 objects
console.log(records);
var dataLength = 2 //set low at moment

for (var i = 0; i < dataLength; i += 1) {
var url = shapes + csvData[i];
options.url = url; //set url query
request(options, function(error, response, body) {

var time = Date.now() - start;
var s = JSON.stringify(body.response);
console.log( '\n' + (Buffer.byteLength(s)/1000).toFixed(2)+
" kilobytes downloaded in: " + (time/1000) + " sec");
console.log(i)
buildJSON(s);
});
}

function buildJSON(s) {
var newStr = s.substring(1, s .length-1);
jsonData += newStr + ',';
writeFile(jsonData);
}

function writeFile(jsonData) {
fs.writeFile(pathJSON, jsonData, function(err) {
if (err) {
return console.log(err);
} else {
console.log("file complete")
}
});
}

});

128.13 kilobytes downloaded in: 2.796 sec
2
file complete

256.21 kilobytes downloaded in: 3.167 sec
2
file complete

最佳答案

也许在所有请求完成后写入文件会有所帮助。在当前代码中,每次请求完成时都会调用writeFile函数(每次都会覆盖文件)

解决此问题的快速方法是计算请求(和失败)并仅在所有请求完成后才写入文件。

"use strict";
const fs = require('fs');
const request = require('request');
var parse = require('csv-parse');

const path = "../path tocsv.csv";
const pathJSON = "../pathtoJSON.json";
var shapes = "https://url";

var options = {
url: '',
method: 'GET',
accept: "application/json",
json: true,
};

var csvData = [];
var jsonData = "[";
fs.createReadStream(path)
.pipe(parse({
delimiter: ','
}))
.on('data', function (data) {
csvData.push(data[1]);
})
.on('end', function () {
var start = Date.now();
var records = csvData.length //2212 objects
console.log(records);
var dataLength = 2 //set low at moment
var jsonsDownloaded = 0; // Counter to track complete JSON requests
var jsonsFailed = 0; // Counter to handle failed JSON requests
for (var i = 0; i < dataLength; i += 1) {
var url = shapes + csvData[i];
options.url = url; //set url query
request(options, function (error, response, body) {
if(error){
jsonsFailed++;
writeFile(jsonData);
return;
}
jsonsDownloaded++;
var time = Date.now() - start;
var s = JSON.stringify(body.response);
console.log('\n' + (Buffer.byteLength(s) / 1000).toFixed(2) +
" kilobytes downloaded in: " + (time / 1000) + " sec");
console.log(i)
buildJSON(s);
});
}

function buildJSON(s) {
var newStr = s.substring(1, s.length - 1);
jsonData += newStr + ',';
writeFile(jsonData);
}

function writeFile(jsonData) {
if(dataLength - (jsonsDownloaded + jsonsFailed) > 0){
return;
}
fs.writeFile(pathJSON, jsonData, function (err) {
if (err) {
return console.log(err);
} else {
console.log("file complete")
}
});
}

});

注意:

根据我的经验,快速连续触发的请求(例如(for 循环中的 2000 个请求))效果不佳。尝试对它们进行批处理。另外,这样做并不能保证顺序(如果这在您的用例中很重要)

另一种方法是以附加模式打开文件。您可以通过传递一个额外的选项对象来完成此操作,并将 flag 设置为您的 fs.writeFile 调用。

fs.writeFile(pathJSON, jsonData, {
flag: 'a'
}, function (err) {
if (err) {
return console.log(err);
}
});

引用文献:

fs.writeFile Docs

File system flags

关于javascript - 将来自对 REST API 的重复请求的最终 json 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com