将got.stream管道传输到文件

时间:2020-07-27 06:07:34

标签: node.js stream got

我正在重构一些在Node中使用http模块的代码,改而使用got。我尝试了以下方法:

function get(url, filePath) {
  return new Promise((resolve, reject) => {
    got.stream(url).on
        ("response", response => {
            const newFile = fs.createWriteStream(filePath);
            response.pipe(newFile);
            newFile.on("finish", () => {
              newFile.close(resolve());
            });
            newFile.on("error", err => {
              reject(err);
            });    
        }).on
        ("error", err => {
             reject(err);
        });
  });
}

finish事件从未触发。文件(filePath用0个字节创建。

使用newFile的代码块在我使用Node http模块时有效。

got.stream传送到文件的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

对于got() documentation,您想将流直接管道传输到文件,如果使用pipeline()进行操作,它将收集错误并报告完成情况。

const pipeline = promisify(stream.pipeline);
const fsp = require('fs').promises;

function get(url, filePath) { 
    return pipeline(
        got.stream(url),
        fs.createWriteStream(filePath)
    );
}

// usage
get(...).then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

仅供参考,got.stream()的意义是返回一个可以直接用作流的流,并且由于您希望将其转到文件,因此可以将该流通过管道传输到该文件。我使用pipeline()而不是.pipe(),因为管道具有比.pipe()更完整的错误处理,尽管在非错误条件下,.pipe()也可以工作。


这是一个在出现错误时清理输出文件的版本:

function get(url, filePath) { 
    return pipeline(
        got.stream(url),
        fs.createWriteStream(filePath)
    ).catch(err => {
         fsp.unlink(filePath).catch(err => {
             if (err.code !== 'ENOENT') {
             // trying to delete output file upon error
                 console.log('error trying to delete output file', err);
             }
         });
         throw err;
    });
}
相关问题