【问题标题】:Premature close with pipeline, but not if using pipe使用管道过早关闭,但如果使用管道则不会
【发布时间】: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


    【解决方案1】:

    pipeline function 需要一个转换流作为中间参数,一个可写和可读的流。请注意,您的原始代码进行了两次 .pipe() 调用,一次进入stdin,一次来自stdout,但您的第二个sn-p 只使用stdin。你必须写

    function logError(err) {
        if (err) {
            console.log(err);
        }
    }
    pipeline(readStream, imageMagicStream.stdin, logError);
    pipeline(imageMagicStream.stdout, writeStream, logErrr);
    

    您也许还可以从子进程的stdinstdout 构造一个双工流,但这似乎不必要地复杂。

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多