首页 > 解决方案 > 你如何使用 got node 模块和 node createWriteStream 来下载带有电子的图像?

问题描述

我看过其他几个答案,但它们对我没有帮助。

节点版本 16.8.0 windows 10“得到”:“11.8.2”,电子 14.0.0

这是我正在尝试的。下面的代码确实下载了文件,但 createWriteStream 抛出错误——

Uncaught (in promise) TypeError [ERR_INVALID_RETURN_VALUE]:预期 AsyncIterable 或 Promise 将从“目标”函数返回,但类型未定义。

我的渲染文件中的代码

module.exports.getTile = async function (url, outputFilePath) {
    const pipeline = promisify(stream.pipeline);

    await pipeline(
        got.stream(url),
        fs.createWriteStream(outputFilePath),
        (err) => {
            if (err) {
                console.error('Pipeline failed', err);
            } else {
                console.log('Pipeline succeeded');
            }
        });


    stream.finished(input, (err) => {
        if (err) {
            console.error('Stream failed', err);
        } else {
            console.log('Stream is done reading');
        }
    });
};

我用await getTile(url, tilePath);

标签: node.jselectron

解决方案


stream.pipeline(...streams, callback)根据文档接受n 个流中间件和最终回调参数。

util.promisify(...args, callback)接受带有错误优先回调的函数,并将其包装到引发错误的异步函数中。(文档

当两者结合时,util.promisify将消耗 中的最终回调参数stream.pipeline,并返回一个只接受流中间件的异步函数:util.promisify(stream.pipeline)(...streams)

因此,以下代码段

await pipeline(
        got.stream(url),
        fs.createWriteStream(outputFilePath),
        (err) => {
            if (err) {
                console.error('Pipeline failed', err);
            } else {
                console.log('Pipeline succeeded');
            }
        });

应改写为:

try {
  await pipeline(
    got.stream(url),
    fs.createWriteStream(outputFilePath)
  )
  console.log('Pipeline succeeded');
}
catch( error ){
  console.error('Pipeline failed', err);
}

推荐阅读