【发布时间】:2022-01-22 12:26:53
【问题描述】:
我想要做的只是有一个漂亮而简单的函数,它将获取一个 url 并将其保存到一个文件中,但是我或一些 JS 开发人员朋友一整天都能够提出的每一个实现都给出了最终结果相同:一个空文件。
import * as fs from 'fs';
import * as path from 'path';
import fetch from 'node-fetch';
import { Headers } from 'node-fetch';
export function downloadURL(url, saveLocation) {
const absSaveLocation = path.resolve(saveLocation);
const myHeaders = new Headers();
myHeaders.append('User-Agent', 'hifumi-js:v1.0.0');
if (url.includes("pximg")) {
myHeaders.append('Referer', 'https://www.pixiv.net/');
}
const requestOptions = {
method: 'GET',
headers: myHeaders,
}
const fileStream = fs.createWriteStream(absSaveLocation);
fetch(url, requestOptions)
.then(res => res.body.pipe(fileStream))
.catch(error => console.log('error', error));
fileStream.on('finish', () => {fileStream.close();});
}
我尝试了一堆不同的库,包括 https、request、fetch、axios,它们都给了我同样无用的空文件。它也不能是 url,因为它在下载之前首先与正则表达式匹配,并且我已经确认了无数不同的 url。
【问题讨论】:
-
不幸的是,当将 node-fetch 换成 undici 时,结果相同,感谢您的文章,尽管阅读内容很有趣
-
您的代码对我有用。我怀疑问题是您在调用
downloadURL后尝试立即读取该文件,而该文件仍然为空。 -
看来你是对的,如果我切断了在 downloadURL 之后运行的所有代码,那么它会下载整个图像,如果我只切断几行然后仅下载图像的一部分。
fileStream.on('finish', () => {fileStream.close();});不应该让它写入文件直到它完成吗?
标签: javascript node.js fetch-api