Как клонировать читаемый поток - PullRequest
1 голос
/ 24 февраля 2020

У меня есть поток, я пытаюсь отправить один и тот же поток двум разным адресатам. Первый пункт назначения - AWS S3, второй пункт назначения - какой-то другой бэкэнд через HTTP-запрос.

const document = fs.createReadStream(process.cwd() + "/test/resources/" + "id/document.jpg");

const s3Response = await submitToS3(document);

const backendResponse = await submitToBackend(document);

Из того, что я понимаю, поток может быть прочитан только один раз. Как я могу отправить один и тот же поток в двух разных направлениях.

Я думал о клонировании потока, но простое создание новой переменной и присвоение потока этой переменной не работает.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Ответ Рагхавендры говорит о хорошем потенциальном направлении. Вы можете объединить несколько каналов из этого ответа с реализацией канала S3 из этого ответа .

Для части submitToBackend не уверены точно, как выглядит ваша реализация, но при условии, что вы можете передать какой-то HTTP-запрос ...

Пример:

var fs = require("fs");
const request = require("request");
const AWS = require("aws-sdk");
const s3 = new AWS.S3();

const rs = fs.createReadStream(process.cwd() + "/test/resources/" + "id/document.jpg");

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;
}

rs.pipe(uploadFromStream(s3));

// Just guessing at your submitToBackend implementation:
const backendWs = request.post("http://example.com/docs");

// However it works, if you can get to a stream.Writable, you can now pipe the same stream.Readable:
rs.pipe(backendWs);
0 голосов
/ 24 февраля 2020
var fs = require("fs");
var ReadableStreamClone = require("readable_stream");

var readStream = fs.createReadStream('text1.txt');

var readStream1 = new ReadableStreamClone(readStream);
var readStream2 = new ReadableStreamClone(readStream);

var writeStream1 = fs.createWriteStream('testsample1.txt');
var writeStream2 = fs.createWriteStream('testsample2.txt');

readStream1.pipe(writeStream1)
readStream2.pipe(writeStream2)
...