Node.js Обновление файла, хранящегося на S3 с использованием потоков - PullRequest
0 голосов
/ 16 октября 2018

Что я хочу сделать, так это прочитать файл с S3 - обновить некоторую информацию - загрузить его обратно, используя потоки, без необходимости создавать копию файла на сервере.Я использовал библиотеку событий-потоков для анализа файла следующим образом: (Обновлено с решением!)

let params = {
    Bucket: Bucket,
    Key: Key,
};
let rStream = s3.getObject(params).createReadStream();
let updatedFile = fs.createWriteStream('/tmp/updated-' + Key);

return new Promise((resolve, reject) => {
    let s = rStream
        .pipe(es.split())
        .pipe(es.mapSync(function(data) {
            if(!data) return;

            s.pause();
            let line = data.split(',');

            if(line[1]==='xyz'){
                line[1] = 'xyz11';
            }

            updatedFile.write(line.join(','));
            updatedFile.write('\n');

            s.resume();
        })
        .on('error', function(err) {
            reject(err);
        })
        .on('end', function() {
           updatedFile.end();

           //createReadStream from path of updatedFile
           //s3 upload file logic
           //delete tmp file logic
           resolve(true);
        }));
});

Моя проблема в том, что когда я возвращаю этот поток обратно, он закрывается и имеет читабельный: ложь, поэтому яне могу его использовать:

const updatedStream = fs.createReadStream(tmpfilePath); 
            params={
                Bucket: Bucket,
                Key: Key,
                Body: updatedStream
            };
await s3.upload(params)
  .on('httpUploadProgress', (progress) => {
       console.log('progress', progress)
  })
  .send();

try {
   fs.unlink(tmpfilePath, function (err) {
     if (err) throw err;
       console.log("Tmp File deleted successfully.");
      });
} catch(err) {
   console.log("Warning: Unable to delete the tmp file.", err);
}

Есть мысли?Поток событий закрывает поток, и поэтому его можно прочитать: false, когда я передаю его обратно.

Как создать поток чтения, изменить данные и сделать поток читаемым, чтобы передать его в функцию s3.upload?

РЕШЕНИЕ

В конце концов мне удалось заставить это работать.

Я создал временный файл writeStream, в который я пишу после каждой итерации.Когда поток заканчивается, я закрываю writeStream, чтобы закрыть свой временный файл.

Затем я загружаю его обратно в S3 (создавая readStream из моего временного файла).

После завершения загрузки я удаляю временный файл.

...