我正在尝试使用node.js的knox模块来管理Amazon S3存储桶中的一些小文件。一切都很好单机:我可以上传文件,下载文件等。但是,我希望能够按周期性的时间表下载文件。当我修改代码以在一个间隔上运行时,我将下载的文件附加到前一个实例而不是覆盖。
我不确定我是否在文件写入代码或knox处理代码中犯了错误。我已经尝试了几种不同的写入方法(writeFile,writeStream等),我查看了knox源代码。对我来说,没有什么是明显的问题。这是我正在使用的代码:
knox = require('knox');
fs = require('fs');
var downFile = DOWNFILE;
var downTxt = '';
var timer = INTERVAL;
var path = S3PATH + downFile;
setInterval(function()
{
var s3client = knox.createClient(
{
key: '********************',
secret: '**********************************',
bucket: '********'
});
s3client.get(path).on('response', function(response)
{
response.setEncoding('ascii');
response.on('data', function(chunk)
{
downTxt += chunk;
});
response.on('end', function()
{
fs.writeFileSync(downFile, downTxt, 'ascii');
});
}).end();
},
timer);
答案 0 :(得分:1)
问题在于您var downTxt = '';
的展示位置。这是您将textTxt设置为空白的唯一位置,因此每次检索更多数据时,都会将其添加到上一个请求中的数据中,因为您从未清除上一个请求中的数据。最简单的解决方法是将该行移到setEncoding
行之前。
但是,处理数据的方式不必要地复杂化。尝试这样的事情。您不需要每次都重新创建客户端,如果您正在下载非文本文件,设置编码只会破坏事情,并且它不会对文本文件产生影响。接下来,您不应手动收集数据,您可以在收到数据时立即开始将其写入文件。最后,由于请求是标准流,因此您无需监控“数据”事件,因为您只能使用pipe
。
var knox = require('knox'),
fs = require('fs'),
downFile = DOWNFILE,
timer = INTERVAL,
path = S3PATH + downFile,
s3client = knox.createClient({
key: '********************',
secret: '**********************************',
bucket: '********'
});
(function downloadFile() {
var str = fs.createWriteStream(downFile);
s3client.get(path).pipe(str);
str.on('close', function() {
setTimeout(downloadFile, timer);
});
})();