自述文件包含以下代码,作为编写读取文件的示例:
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()
以使用来使用写入磁盘的文件。实际上,似乎我的代码在文件完成写到磁盘之前就已经运行了,所以我想到以上代码返回的promise应该考虑在流上发出“ end”事件。也许是这样的:
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)如果我无权访问它,如何知道读流何时关闭才能解决?
ps。
不,我无法从.pipe()
获取流,该流返回未定义
答案 0 :(得分:1)
据我所知,您的代码是正确的。我跑了
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"
答案 1 :(得分:0)
我知道了。可写流将在可读时自动关闭。所以我可以代替它:
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);
}));