node.js - 如何从 nodeJS 中的 URL 获取文件,构建 zip 文件并通过管道传输到云存储桶
问题描述
我想构建一个接收这样一个对象的云函数:
{
"files": [
{
"url": "https://myUrl/cat.jpg",
"name": "cat.jpg"
},
{
"url": "https://anyOtherUrl/mouse.jpg",
"name": "mouse.jpg"
},
{
"url": "https://myUrl2/dog.jpg",
"name": "dog.jpg"
}
],
"referenceId": "cute-images"
}
我想获取这些文件,将它们压缩成一个 zip 文件(名称 = referenceId),将该 zip 文件保存到存储桶中,最后将 zip URL 作为响应发回。
我的主要问题在于内存的使用和我正确使用管道/流的愿望。我真的很感激在哪里可以找到这个实现的文档的好资源。
这是我现在得到的,但我不知道它是否有好处:
const ZipStream = require("zip-stream");
const fetch = require("node-fetch");
const { Storage } = require("@google-cloud/storage");
exports.zipBuilder = async (req, res) => {
// Deleted lines of request validation
let zip = new ZipStream();
const queue = req.body.files;
async function addFilesToZip() {
let elem = queue.shift();
const response = await fetch(elem.url);
const stream = await response.buffer();
zip.entry(stream, { name: elem.name }, (err) => {
if (err) throw err;
if (queue.length > 0) addNextFile();
else zip.finalize();
});
}
await addFilesToZip();
const storage = new Storage();
const ourBucket = storage.bucket(process.env.DESTINATION_BUCKET);
zip.pipe(ourBucket); // this fails
// Get ZIP URL from bucket
res.send(zipUrl);
};
编辑:这个问题似乎有很多问题。但是由于这必须作为一个单一的流来工作,所以我要求的不是确切的答案,而是关于研究什么以更好地理解解决方案的想法。
解决方案
您收到“未处理的拒绝 TypeError: dest.write is not a function” bc ourBucket
is not a writable stream。它必须是可写流的实例,您才能通过管道传输到它。您应该创建一个存储桶文件可写流并将其用作ourBucket
.
推荐阅读
- c++ - SFML 没有声音播放存储在 ResourceHolder 中的声音缓冲区
- java - 第二天服务端的Kafka就失败了。(EndOfStreamException: Unable to read additional data from client,)
- ios - scrollView 旋转中的 WKWebView 留下空白
- jquery - Safari 单选按钮上未触发“模糊”事件的 jQuery
- ibm-cloud - 应用仅专用网络策略时如何从 CLI 管理 IBM Cloud Key-Protect 实例?
- java - 如何在 Gradle 中使用 jdk.internal 包?
- python - 获取 ValueError - 在 Pandas 中使用 explode() 时出现非唯一多索引
- python - 如何在python中从url下载PDF
- java - 为什么我想使用 java.io.File 类时出现“找不到符号”错误?
- javascript - 使用 HMTL 和 JavaScript fetch 在列表中查找对象