Создайте дублированный файл с потоками FS и сможете прочитать его - PullRequest
1 голос
/ 09 марта 2019

В настоящее время я пытаюсь скопировать содержимое файла в другой файл с помощью Node.js с помощью функций fs.createWriteStream и fs.createReadStream .

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

Я проверил его содержимое, и там, похоже, это не имеет значениялогика программирования, поскольку данные исходного файла были правильно перенесены в копию.Вот мой сценарий, если вы хотите взглянуть.

const express = require('express')
const app = express()
const fs = require("fs")
var Promise = require("bluebird")
Promise.promisifyAll(fs)

const path = require('path')
const file1 = path.join(__dirname, 'sample1.wav') // The file to copy
const file2 = path.join(__dirname, 'sample2.wav') // The destination of the new file

app.use(async(req,res,next)=>{

  let file1_stream = await fs.createReadStream(file1)
  let file2_stream = await fs.createWriteStream(file2)
  file2_stream.pipe(file2_stream)
  next()

})

.listen(8080)

Я предполагаю, что операция не так проста, как простое копирование потока и внедрение его с помощью канала, как показано выше.если кто-то имеет представление о том, что мне здесь не хватает, я весь в ушах.Заранее спасибо.

1 Ответ

1 голос
/ 09 марта 2019

Этот код вызывает ошибку, которую вы, вероятно, неправильно обрабатываете, так как вы используете асинхронное промежуточное ПО в экспрессе.

 Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable

Вы должны использовать .pipe на readableStream, а не на writeableStream

Таким образом, код должен быть:

file1_stream.pipe(file2_stream);

Кроме того, вам не нужно await на fs.createWriteStream. Это ничего не делает. Promisify работает на API обратных вызовов, но createWriteStream & createReadStream не принимает обратный вызов в качестве аргумента.

app.use((req,res,next)=>{

  let readStream = fs.createReadStream(file1);
  let writeStream = fs.createWriteStream(file2);
  readStream.pipe(writeStream);

  // Call next once the file was actually copied
  writeStream.on('finish', next);

  writeStream.on('error', next); // go to express error handler
  readStream.on('error', next);

});
...