Node.js 使用fs streams创建一个复制文件,并能够读取它
我目前正试图通过fs.createWriteStream和fs.createReadStream函数使用Node.js将文件内容复制到另一个文件中 更具体地说,该文件是一个音乐样本,我想复制。此外,我希望生成的文件能够像任何音乐或视频一样被播放器读取。这是我没有做到的最后一点。这些文件确实是重复的,但是我的播放器不接受生成的文件作为可读文件,就像它被破坏了一样 我检查了它的内容,在那里它似乎不是一个编程逻辑问题,因为原始文件的数据已经正确地转换到副本中。这是我的剧本,如果你想看的话Node.js 使用fs streams创建一个复制文件,并能够读取它,node.js,file,copy,fs,Node.js,File,Copy,Fs,我目前正试图通过fs.createWriteStream和fs.createReadStream函数使用Node.js将文件内容复制到另一个文件中 更具体地说,该文件是一个音乐样本,我想复制。此外,我希望生成的文件能够像任何音乐或视频一样被播放器读取。这是我没有做到的最后一点。这些文件确实是重复的,但是我的播放器不接受生成的文件作为可读文件,就像它被破坏了一样 我检查了它的内容,在那里它似乎不是一个编程逻辑问题,因为原始文件的数据已经正确地转换到副本中。这是我的剧本,如果你想看的话 const
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)
我想操作并不像复制一个流并用上面所示的管道注入它那样简单。如果有人知道我在这里遗漏了什么,我洗耳恭听。提前感谢。该代码触发了一个错误,您可能没有正确处理该错误,因为您在express上使用的是异步中间件
Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable
您必须在可读流
上使用.pipe
,而不是在可写流
因此,代码应该是:
file1_stream.pipe(file2_stream);
另外,您不需要在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);
});
我能说什么?它就像一个符咒。我不知道为什么我试图异步所有的进程,那是胡说八道。非常感谢您的回答和非常简洁的解释。很高兴它奏效了!。如果您想了解express&async中间件,可以查看我的回答: