我在节点的转换流中苦苦挣扎。
我有2个流,分别是流1和流2。都是双流。
现在,当我写入“ Stream 2”时,我需要转换传递的数据。
例如,假设我想包装一个字符串#
Stream 1 | | Transform | | Stream 2
--------------------------------------------------
[device] | --> | [decode] | --> | [output]
[device] | <-- | [encode] | <-- | [input]
下面的转换代码按预期方式工作。
const stream = require("stream");
const encode = new stream.Transform({
transform: (data, encoding, done) => {
// feedback
console.log("[encode] called");
// pass transformed data back
// err = not connected message ?!
done(null, `#${data}#`);
}
});
const decode = new stream.Transform({
transform: (data, encoding, done) => {
// feedback
console.log("[decode] called");
// pass transformed data back
// err = not connected message ?!
done(null, data.toString().replace(/#/g, ""));
}
});
const device = new stream.PassThrough();
const adapter = new stream.PassThrough();
device.pipe(decode).pipe(process.stdout);
adapter.pipe(encode).pipe(process.stdout);
adapter.write("Test");
process.stdout.write("\n")
device.write("#Test#");
我遇到的困难是,如何将两个转换流都包装为一个双工流?
这会创建一个循环,因为我将解码后的数据写回到了管道编码器流中
function f(uplink) {
const wrapper = new stream.PassThrough();
wrapper.pipe(encode).pipe(uplink);
uplink.pipe(decode).pipe(wrapper);
return wrapper;
}
const device = new stream.PassThrough();
//const adapter = new stream.PassThrough();
const adapter = f(device);
adapter.write("Test");
process.stdout.write("\n")
device.write("#Test#");
我应该使用独立的可写/可读流吗? 但是话又说回来,我如何将它们合并/合并为单个双工流?