【问题标题】:How to get files from URLs in nodeJS, build a zip file and pipe to cloud storage bucket如何从 nodeJS 中的 URL 获取文件,构建 zip 文件并通过管道传输到云存储桶
【发布时间】:2021-02-01 22:11:32
【问题描述】:

我想构建一个接收这样一个对象的云函数:

{
    "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);
};

编辑:这个问题似乎是很多问题合二为一。但由于这必须作为单一流进行,所以我要求的不是确切的答案,而是关于研究什么以更好地理解解决方案的想法。

【问题讨论】:

  • 为什么zip.pipe(ourBucket) 会失败?给出的错误是什么?
  • 上面写着Unhandled rejection TypeError: dest.write is not a function
  • 第一个错误是没有等待addFilesToZip()。它应该有await addFilesToZip(),因为它是一个异步函数,我们依赖完成状态来进行下一个操作。

标签: node.js google-cloud-platform zip


【解决方案1】:

您收到“未处理的拒绝类型错误:dest.write 不是函数”,因为 ourBucket 不是 writable stream。它必须是可写流的实例,您才能通过管道传输到它。您应该创建一个bucket file writable stream 并将其用作ourBucket

【讨论】:

  • 总的来说,您正朝着正确的方向前进。这是需要工作的实施细节。我会将其分为 3 个步骤并单独测试每个步骤。首先,下载文件。第二,压缩文件。三、上传。四、生成公共url。
  • 好的!我会做!我实现了 file.createWriteStream() ,现在我根本没有收到任何错误,但没有写入文件。哈哈。仍然感谢您的帮助,我恢复了惰性。
猜你喜欢
  • 2016-06-14
  • 2019-01-27
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多