【发布时间】:2020-07-18 19:48:30
【问题描述】:
这是一个我无法理解的问题。
这行得通:
let readStream = fs.createReadStream(imgPath);
let imageMagicStream = spawn('convert', ['-', '-resize', '750', '-'], { env: env });
let writeStream = fs.createWriteStream(out);
readStream.pipe(imageMagicStream.stdin);
imageMagicStream.stdout.pipe(writeStream);
但是,如果我尝试改用管道,则会收到“错误 [ERR_STREAM_PREMATURE_CLOSE]: Premature close”:
let readStream = fs.createReadStream(imgPath);
let imageMagicStream = spawn('convert', ['-', '-resize', '750', '-'], { env: env });
let writeStream = fs.createWriteStream(out);
pipeline(readStream, imageMagicStream.stdin, writeStream, err => {
if (err) {
console.log(err);
}
});
看来 writeStream 提前关闭了。为什么会发生这种情况,我该如何解决?
跟进回答:
感谢Bergi 的回答。我找到了一个包(npm i duplexer),可以让您轻松创建双工流。我的代码现在看起来像这样:
const { pipeline } = require("stream");
const duplexer = require('duplexer');
async function resizeImg(imgPath, out) {
return new Promise(async (resolve, reject) => {
let readStream = fs.createReadStream(imgPath);
let imageMagicStream = spawn('magick', ['convert', '-', '-resize', '750', '-'], { env: env });
let writeStream = fs.createWriteStream(out);
let duplexStreams = duplexer(imageMagicStream.stdin, imageMagicStream.stdout);
await pipeline(readStream, duplexStreams, writeStream, err => {
if (err) {
console.log(err);
return reject(err);
}
});
return resolve();
});
}
【问题讨论】:
标签: javascript node.js pipe pipeline