Преобразование удаленного потока в поток файлов (NodeJS) - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь извлечь поток чтения удаленно и передать ссылку на него другой функции так же, как я могу с fs.createReadStream(filePath).

Для контекста у меня есть конечная точка REST, которая принимает файл CSV. Эта конечная точка записывает файл во временное местоположение и создает поток чтения из него. Он передает ссылку на этот поток другой функции, которая его обрабатывает. Теперь у меня есть вторая конечная точка, которая может принять имя файла и извлечь его из удаленного ресурса, используя пакет request . Этот удаленный ресурс создает поток чтения и передает его ответу. Я хочу получить этот поток чтения и передать ссылку на уже существующую функцию.

Я получил эту работу, имитируя поведение другой конечной точки. Я могу получить читаемый поток, направить его в записываемый поток и вернуть поток чтения из этого местоположения (см. Фрагмент # 1 для сильно упрощенного примера). Я не особо хочу go с этим решением, поскольку оно требует от меня преобразования потока в файл (который я затем должен удалить из файловой системы) и обратно в поток.

// SNIPPET #1 (Works)

const getStream = (cb) => {
    request(opts)
        .pipe(createWriteStream(filePath)) // write the file to the temporary location
        .on('finish',  () => cb(createReadStream(filePath))); // create a read stream 
}

const processStream = (readStream) => {
   readStream.pipe(doStuff);
}

getStream(processStream);

Я попытался просто вернуть вызов на request (см. Фрагмент # 2), но я получил readStream.pipe is not a function.

// SNIPPET #2 (Throws "readStream.pipe is not a function")

const getStream = () => {
    return request(opts)
}

const processStream = (readStream) => {
   readStream.pipe(doStuff);
}

processStream(getStream());

Затем я попытался создать экземпляр из stream.Readable, возвращайте это и данные pu sh к нему всякий раз, когда происходит событие request data (см. фрагмент # 3), но я снова получаю ошибку readStream.pipe is not a function.

// SNIPPET #3 (Throws "readStream.pipe is not a function")

const getStream = () => {
    const { Readable } = require('stream');
    const readStream = new Readable({
        read () {}
    });

    request(opts).on('data', chunk => readStream.push(chunk));

    return readStream;
}

const processStream = (readStream) => {
   readStream.pipe(doStuff);
}

processStream(getStream());

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

...