英文:
fs.createWriteStream is streaming but not writing
问题
I only recently noticed that the following code is not doing what it was doing earlier… actually writing the file to the disk.
const download = async (archive) => {
const d = await new Promise((resolve) => {
const opts = { method: 'GET' };
const req = https.request(url, opts, (res) => {
const file = fs.createWriteStream(`path/to/${archive}`);
res.on('data', (chunk) => {
file.write(chunk);
//process.stdout.write(chunk);
})
.on('end', () => file.end());
resolve(archive);
});
req.on('error', (error) => console.error(error));
req.end();
});
}
the file is getting created on disk, but is only 0B
. If I uncomment process.stdout.write(chunk)
, it happily spits out gobbledegook of the binary file to the console. But nothing is actually written to the disk.
Where am I goofing up? or has something changed in node
recently that is silently screwing up my code? Very happy for any guidance.
英文:
I only recently noticed that the following code is not doing what it was doing earlier… actually writing the file to the disk.
const download = async (archive) => {
const d = await new Promise((resolve) => {
const opts = { method: 'GET' };
const req = https.request(url, opts, (res) => {
const file = fs.createWriteStream(`path/to/${archive}`);
res.on('data', (chunk) => {
file.write(chunk);
//process.stdout.write(chunk);
})
.on('end', () => file.end());
resolve(archive);
});
req.on('error', (error) => console.error(error));
req.end();
});
}
the file is getting created on disk, but is only 0B
. If I uncomment process.stdout.write(chunk)
, it happily spits out gobbledegook of the binary file to the console. But nothing is actually written to the disk.
Where am I goofing up? or has something changed in node
recently that is silently screwing up my code? Very happy for any guidance.
答案1
得分: 0
更新: 我说得太快了。请参阅下面的评论
更新2: 这对我有帮助。现在完整的 zip 文件可以正确下载并解压缩
感谢 @jfriend00 的评论,以下编辑修复了问题
const download = async (archive) => {
const d = await new Promise((resolve) => {
const opts = { method: 'GET' };
const req = https.request(url, opts, (res) => {
const file = fs.createWriteStream(`path/to/${archive}`);
res.on('data', (chunk) => {
file.write(chunk);
})
.on('end', () => {
file.end());
// 将 resolve() 移到这里
resolve(archive);
});
//resolve(archive);
});
req.on('error', (error) => console.error(error));
req.end();
});
}
我本以为原始代码没问题,突然就不工作了,但我很高兴我没有发誓。
更新:
上述编辑没有帮助。虽然现在文件确实被下载,但下载不正确。它是一个 zip 文件,但当我尝试解压缩时,出现错误
错误: 命令失败: …
未找到中央目录签名。这个
文件不是一个 zip 文件,或者它构成了一个多部分归档的一个磁盘。在后一种情况下,
中央目录和 zip 文件的注释将在这个
归档的最后一个磁盘上找到。
但是当我直接下载文件时,解压缩正常。所以我的代码没有正确下载文件。
英文:
update: I spoke to soon. See comment below
update2: this helped me. The full zip file is downloading and unzipping properly now
thanks to the comment from @jfriend00, the following edit fixed the problem
const download = async (archive) => {
const d = await new Promise((resolve) => {
const opts = { method: 'GET' };
const req = https.request(url, opts, (res) => {
const file = fs.createWriteStream(`path/to/${archive}`);
res.on('data', (chunk) => {
file.write(chunk);
})
.on('end', () => {
file.end());
// moving resolve() here
resolve(archive);
});
//resolve(archive);
});
req.on('error', (error) => console.error(error));
req.end();
});
}
I could have sworn the original code was working fine and then stopped working, but I am glad I didn't swear.
update:
The edits above do not help. While now the file does get downloaded, it is not downloaded properly. It is a zip file, but when I try to unzip it, I get an error that
Error: Command failed: …
End-of-central-directory signature not found. Either this
file is not a zipfile, or it constitutes one disk of a
multi-part archive. In the latter case the central directory
and zipfile comment will be found on the last disk(s) of this
archive.
But when I download the file directly, it unzips just fine. So my code is not downloading the file properly.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论