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