Архиватор объединяет / соединяет с PassThrough (), добавляет и завершает не функцию - Nodejs Stream - PullRequest
0 голосов
/ 20 июня 2020

Итак, я загружаю файлы с помощью потока Ax ios, заархивирую их архиватором, а затем хочу загрузить zip в корзину s3. Сначала я сохранил zip в локальном каталоге, так все работало нормально. Я использовал multipipe lib для объединения потоков. Объедините zip-поток архиватора с fs.createWriteStream

 function uploadFromStream(name) {
   const output = fs.createWriteStream(__dirname + `/${name}.zip`);

   const zip= combine(archive, output);
    return zip
 }

На вершине ios end

zip.append(response.data.pipe(new PassThrough()), { name: name });

Все работает как положено, Zip сохраняется со всеми файлами в нем.

Затем я исследовал и искал, как загрузить в s3 с помощью потока. Я нашел этот способ. Передать поток в s3.upload ()

inputStream .pipe (uploadFromStream (s3));

function uploadFromStream(s3) {
  var pass = new stream.PassThrough();

  var params = {Bucket: BUCKET, Key: KEY, Body: pass};
  s3.upload(params, function(err, data) {
    console.log(err, data);
  });

  return pass;
}

Я реализовал это с помощью такого архиватора.

function uploadFromStream(bucket, destination) {
  var pass = new stream.PassThrough();

  var params = { Bucket: bucket, Key: destination, Body: pass };
  S3.upload(params, function (err, data) {
    console.log(err, data);
  });

  const s3Stream = combine(archive, pass);

  return s3Stream;
}

Теперь, когда я пытаюсь добавить, я получаю сообщение об ошибке «Добавить не функцию», когда finalize не является функцией. Когда я проверял, я обнаружил, что s3Stream.append и s3Stream.finalize не определены. Я не думаю, что это должно произойти, но я полагаю, что PassThrough удаляет функции из объединенного потока.

И такие потоки конвейера, как этот, также не работали.

  return archive.pipe(pass);

1 Ответ

0 голосов
/ 21 июня 2020

Так после многократной регистрации потоков. Я считаю, что pipe не объединяет функции двух потоков, а только создает поток между двумя потоками. Поэтому мне просто нужно передать passThrough и архиватор, а затем вернуть архиватор, чтобы добавить к нему файлы.

function uploadFromStream(bucket, destination) {
  const pass = new stream.PassThrough();

  const params = { Bucket: bucket, Key: destination, Body: archive };

  S3.upload(params, function (err, data) {
    console.log(err, data);
  });
  archive.pipe(pass);

  return archive;
}

Делая это, я не сталкиваюсь с вышеупомянутой ошибкой. Мне плохо было работать с потоками первый раз

...