gpt4 book ai didi

javascript - 如何在写入时拆分 WriteStream?

转载 作者:搜寻专家 更新时间:2023-11-01 00:47:25 26 4
gpt4 key购买 nike

问题:

我有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com