作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题:
我有 fs.createWriteStream(filename)
,其中文件名是通过 res.pipe();
写入的 mp3 文件。来自远程服务器的响应是永无止境的音频数据流。
Time-to-time 服务器发送 res.on('metadata')
可以被解析,我们知道这首歌结束了,新歌开始了。那时我必须“拆分”“文件名”并开始编写另一个“文件名 2”,这最终是另一首歌曲。
问题是,我无法关闭“filename1”的流,并启动另一个 fs.createWriteStream(filename2)
,因为它正被“res.pipe()”使用,如果它关闭了管道中断 -> Node 抛出我无法写入关闭流的错误 -> res 中断 -> 连接丢失,我必须手动重新启动应用程序......
应该如何正确完成?
谢谢!
最佳答案
在 fs 写入流和响应流之间需要一些东西。例如,您可以创建自己的 Writable,这是一个粗略的示例,您仍然可以 res.pipe()
来更改文件,您可以调用 writable.changeFile()
:
const { Writable } = require("stream");
class MyWritable extends Writable {
constructor(options) {
super(options);
this.doChangeFile = false;
this.stream = null;
}
_write(chunk, encoding, callback) {
if (!this.stream) {
// No stream, start a new one
const filename = "generate a new filename here";
this.stream = fs.createWriteStream(filename);
}
if (this.doChangeFile) {
// Swapping files, end current stream and return
this.stream.end(chunk, encoding, callback);
this.stream = null;
this.doChangeFile = false;
return;
}
// Otherwise write chunks to current stream
this.stream.write(chunk, encoding, callback);
}
changeFile() {
this.doChangeFile = true;
}
}
const writable = new MyWritable();
关于javascript - 如何在写入时拆分 WriteStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875525/
我是一名优秀的程序员,十分优秀!