Передача файла в поток записи напрямую клиенту в виде загрузки в node.js - PullRequest
0 голосов
/ 01 декабря 2018

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

Пока я передаю данные в запросе на добавление и добавляю их в конец потока.К сожалению, когда вы передаете поток чтения в поток записи, вы должны указать выходной файл и местоположение для потока записи.Есть ли способ обойти это?Можете ли вы указать расположение выходного файла в качестве соответствующего порта?

Это то, что у меня есть в данный момент (возникает ошибка: невозможно передать, не читается):

app.post("/output_xml", function(req, res) {
    var data = validateJSON(req.body);
    stream_xml(data, res);
});

function stream_xml(data, res)
{
    var read_stream = fs.createReadStream(__dirname + '/Static/input_template.xml')
    var write_stream = fs.createWriteStream(__dirname + '/Static/output.xml') // trying to prevent saving a file to the server though
    read_stream.pipe(write_stream);

    read_stream.on('end', () => {
        write_stream.write(data);
        write_stream.write("\nAdding more stuff");
    });

    write_stream.pipe(res);
} 

Смогу ли я поменяться местами?строка write_stream для чего-то вроде:

var write_stream = fs.createWriteStream('http://localhost:3000/output_xml/output.xml')

1 Ответ

0 голосов
/ 01 декабря 2018

Вы не можете передавать из потока записи, но вы, безусловно, можете передавать из потока преобразования / дуплекса.

Таким образом, вы можете сделать что-то вроде:

const { Transform } = require('stream');

const custom_response = new Transform({
    transform(chunk, encoding, callback) {
        this.push(chunk, encoding);
        callback();
    },

    flush(callback) {
        this.push(data);
        this.push("\nAdding more stuff");
        callback();
    },
});

read_stream.pipe(custom_response).pipe(res);

Альтернативаstream.Transform также может быть stream.PassThrough, который принимает те же параметры, что и Transform, но вам нужно только указать метод flush.

https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...