你如何使用带有节点 createWriteStream 的 got 节点模块来下载带有电子的图像?

How do you use got node module with node createWriteStream to download an image with electron?

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

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

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

Uncaught (in promise) TypeError [ERR_INVALID_RETURN_VALUE]: Expected AsyncIterable or Promise to be returned from the "destination" function but got type undefined.

我的渲染文件中的代码

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);

调用函数

stream.pipeline(...streams, callback) 根据 documentation.

接受 n 流中间件和最终回调参数

util.promisify(...args, callback) 接受一个带有错误优先回调的函数,并将其包装到一个抛出错误的异步函数中。 (docs)

当两者结合时,util.promisify 将使用 stream.pipeline 中的最终回调参数,而 return 一个仅接受流中间件的异步函数: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);
}