nodejs ReadableStream pipeTo файл с WritableStream

Я пытаюсь написать загруженный файл в nodejs 18.12. из ReadableStream с помощью pipeTo в файл на жестком диске. Но следующее терпит неудачу

      const fs = require('fs');
var path = __dirname + '/test.png';
const writeStream = fs.createWriteStream(path);
// stream is a ReadableStream object
stream.pipeTo(writeStream).on('finish', async () => {
      console.log('DONE');
})

с

      TypeError: ReadableStream.prototype.pipeTo's first argument must be a WritableStream

Но я не нашел никаких документов, как правильно работать с pipeTo и сохранять данные в файл. Поиск WritableStream мне тоже не помог. Я использую graphql-yoga 3.x, и ReadableStream — это то, что я получаю от фреймворка.

Я также попробовал решение отсюда , чтобы преобразовать поток в Readable

      const { Readable } = require('node:stream');
var readStream = new Readable().wrap(stream);

который потерпел неудачу сstream.on is not a function

Я также попробовал решение отсюда с помощью Readable.fromWeb

      const writeStream = fs.createWriteStream(path);
var readStream = Readable.fromWeb(stream);
readStream.pipe(writeStream).on('finish', async () => {
  console.log('DONE');
})

что привело меня к этой странной ошибке:

      TypeError: The "readableStream" argument must be an instance of ReadableStream. 
Received an instance of ReadableStream

Я также нашел пример на веб-сайте graphql-yoga для v2, но он тоже не работает.

1 ответ

Поток трубы выглядит следующим образом:

ReadableStream -pipeTo-> TransformStream -pipeTo-> WriteableStream

Но вы должны создать чистый WritableStream, это как буфер для записи чего-то куда-то.

ReadableStream — это поток, который считывает байты из какого-либо объекта, в вашем случае чтение фотографии из файла — это читаемый поток, например:

      var http = require('http');
var fs = require('fs');

http.createServer(function(req, res) {
  // The filename is simple the local directory and tacks on the requested url
  var filename = __dirname+"/test.png";

  // This line opens the file as a readable stream
  var readStream = fs.createReadStream(filename);

  // This will wait until we know the readable stream is actually valid before piping
  readStream.on('open', function () {
    // This just pipes the read stream to the response object (which goes to the client)
    readStream.pipe(res);
  });

  // This catches any errors that happen while creating the readable stream (usually invalid names)
  readStream.on('error', function(err) {
    res.end(err);
  });
}).listen(8080);

этот код преобразует файл в поток чтения, после этого вам нужно создать WriteStream по другой причине, например (в моем случае это ответ), но вы можете написать другой файл, например, чтобы передать это, например:

      var http = require('http');
var fs = require('fs');

http.createServer(function(req, res) {
  // The filename is simple the local directory and tacks on the requested url
  var filename = __dirname+"/test.png";
  var filename2 = __dirname+"/test2.png";

  // This line opens the file as a readable stream
  var readStream = fs.createReadStream(filename);
  var writeStream = fs.createWriteStream(filename2);
  // This will wait until we know the readable stream is actually valid before piping
  readStream.on('open', function () {
    // This just pipes the read stream to the write stream (duplicate the file)
    readStream.pipe(writeStream);
  });

  // This catches any errors that happen while creating the readable stream (usually invalid names)
  readStream.on('error', function(err) {
    res.end(err);
  });
  res.end("it's all");
}).listen(8080);
Другие вопросы по тегам