Проблема с вашим размещением var downTxt = '';
. Это единственное место, где вы устанавливаете значение downTxt пустым, поэтому каждый раз, когда вы извлекаете больше данных, вы добавляете их к данным, полученным в предыдущем запросе, потому что вы никогда не очищаете данные из предыдущего запроса. Самое простое решение - переместить эту строку непосредственно перед строкой setEncoding
.
Однако способ обработки данных неоправданно сложен. Попробуйте что-то вроде этого. Вам не нужно каждый раз заново создавать клиент, а установка кодировки просто сломает вещи, если вы загружаете нетекстовые файлы, и не будет иметь значения для текстовых файлов. Далее, вам не нужно вручную собирать данные, вы можете сразу же начать записывать их в файл по мере их получения. Наконец, поскольку запрос является стандартным потоком, вам не нужно отслеживать событие «data», потому что вы можете просто использовать 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);
});
})();