我使用node-crontab来运行脚本。 fs.writeFile在第一次循环运行时覆盖,但在此之后附加数据。我已经尝试在写入之前删除该文件但是正在执行相同操作,第一次删除它但在后续运行中开始追加。我该怎么办?
这是脚本:我省略了一些环境变量...
var jobId = crontab.scheduleJob('* * * * *', function() {
//Gettting system date and adding leading zeros when are single digits. I need this to build the get request with date filters.
var d = new Date();
var nday = d.getDate();
var nmonth = d.getMonth();
var nhour = d.getHours();
var nmin = d.getMinutes();
var nfullyear = d.getFullYear();
if (nday < 10) {
nday = '0' + nday;
};
var nmin = nmin - 1;
if (nmin < 10) {
nmin = '0' + nmin;
};
if (nhour < 10) {
nhour = '0' + nhour;
};
var nmonth = nmonth + 1;
if (nmonth < 10) {
nmonth = '0' + nmonth;
};
var options = {
url: 'https://credentials@api.comettracker.com/v1/gpsdata' + '?fromdate=' + nfullyear + '-' + nmonth + '-' + nday + 'T' + nhour + '%3a' + nmin + '%3a' + '00',
method: 'GET',
rejectUnauthorized: !debug
};
// HTTP get request
request(options, function(error, response, body) {
if (error) throw new Error(error);
var result = JSON.parse(body)['gps-recs'];
console.log(result.length);
//create .csv file
buildCSV(result);
});
});
function buildCSV(result) {
//adding headers
csvFile = csvFile.concat('UserNumber' + ',' + 'UserTimeTag' + ',' + 'Latitude' + ',' + 'Longitude' + ',' + 'SpeedMph' + ',' + 'Heading' + ',' + 'Status' + '\r\n');
// loop runs result.length times
for (var i = 0; i < result.length; i++) {
csvFile = csvFile.concat(result[i].UserInfo.UserNumber + ',' + result[i].UserTimeTag + ',' + result[i].Latitude + ',' + result[i].Longitude + ',' + result[i].SpeedMph + ',' + result[i].Heading + ',' + result[i].Status + '\r\n');
};
//delete file.csv first
console.log('before unlink: ');
fs.unlink('file.csv', function(err){
if (err) throw err;
else {
console.log('file deleted');
console.log(csvFile);
fs.writeFile('file.csv', csvFile, function(err) {
if (err) throw err;
console.log('file saved');
});
};
});
};
答案 0 :(得分:20)
首先,当我运行你的代码时,如果首先没有文件,我会收到错误。请参阅下面的修复。
为了确保您正在编写,您可以明确地为options参数提供写入标志,如下所示:
console.log('before unlink: ');
fs.unlink('file.csv', function(err){
// Ignore error if no file already exists
if (err && err.code !== 'ENOENT')
throw err;
var options = { flag : 'w' };
fs.writeFile('file.csv', csvFile, options, function(err) {
if (err) throw err;
console.log('file saved');
});
});
因为fs.writeFile()会覆盖文件,所以不需要btw,fs.unlink()。