【问题标题】:Writing the stream returned by node-fetch写入 node-fetch 返回的流
【发布时间】:2019-08-16 09:33:10
【问题描述】:

README 包含以下代码作为编写获取文件的示例:

fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
    .then(res => {
        const dest = fs.createWriteStream('./octocat.png');
        res.body.pipe(dest);
    });

我将连接另一个.then() 以使用写入磁盘的文件。实际上,我的代码似乎在文件完成写入磁盘之前运行,所以我想到上述代码返回的承诺应该考虑到流上“结束”事件的发布。也许是这样的:

fetch(url).then(res => new Promise((resolve, reject) => {
    const dest = fs.createWriteStream(fn);
    res.body.pipe(dest);
    res.body.on('end', () => resolve());
    dest.on('error', reject);
}));

但是当我尝试运行此代码时它会抱怨:

TypeError: res.body.on 不是函数

这是有道理的,因为res.body 看起来像这样:

{ pipe: [Function: pipe] }

也就是说,根本就不是流

两个问题: 1)我怎样才能访问实际的流? 2)如果我无权访问它,我怎么知道读取流何时关闭以便解决?

附言

不,我无法从.pipe() 获取流,它返回未定义

【问题讨论】:

    标签: javascript stream node-fetch


    【解决方案1】:

    我想通了。当可读流关闭时,可写流将自动关闭。所以我可以代替它:

    fetch(url).then(res => new Promise((resolve, reject) => {
        const dest = fs.createWriteStream(fn);
        res.body.pipe(dest);
        dest.on('close', () => resolve());
        dest.on('error', reject);
    }));
    

    【讨论】:

    • 只是想在上面的例子中添加fn是文件名
    【解决方案2】:

    据我所知,您的代码是正确的。我跑了

    const fs = require("fs");
    const fetch = require("node-fetch");
    
    fetch("https://assets-cdn.github.com/images/modules/logos_page/Octocat.png")
      .then(
        res =>
          new Promise((resolve, reject) => {
            const dest = fs.createWriteStream("./tmp.txt");
            res.body.pipe(dest);
            res.body.on("end", () => resolve("it worked"));
            dest.on("error", reject);
          })
      )
      .then(x => console.log(x));
    

    它完全按预期工作并打印了"it worked"

    【讨论】:

    • 也许它与 node.js 的版本有关...我正在运行 11.5.0,它按照我的指示中断
    • @ekkis 嗯,我在 v11.12.0。即使您复制粘贴上述内容并运行它也会中断?
    • 我测试过了。有效。我有点困惑这怎么可能。正在调查...谢谢
    • 我发现了我的问题。在测试中这是一个糟糕的模拟。感谢您对此的跟进
    • 有异步版本吗?
    猜你喜欢
    • 2017-04-27
    • 2021-12-25
    • 2012-08-08
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2018-03-03
    • 2021-11-04
    相关资源
    最近更新 更多