首页 > 解决方案 > Node.js Cloud Function - 将 CSV 数据直接流式传输到 Google Cloud Storage 文件

问题描述

我有一个脚本可以调用 RESTful API 并从报告中分块检索 CSV 数据。我能够在控制台中连接、解析和显示这些数据。我还可以将此 CSV 数据写入本地文件并存储。

我想弄清楚的是如何在将这些数据上传到 GCS 之前跳过创建文件来存储这些数据,而是将其直接传输到 Google Cloud Storage 以另存为文件。由于我试图使其成为无服务器云功能,因此我试图将其直接从内存流式传输到 Google Cloud Storage 文件中。

我在 google 上找到了这个'Streaming Transfers'文档,但它仅引用了使用 'gsutil' 执行此操作,我正在努力寻找有关如何使用 node.js 执行此操作的任何示例或文档。我也尝试在 Stack Overflow 上遵循这个答案,但它是从 2013 年开始的,这些方法似乎有点过时了。我的脚本也不是面向用户的,所以我不需要打任何路线。

我可以使用以下功能将本地文件直接上传到我的存储桶,因此身份验证不是问题。我只是不确定如何将内存中的 CSV blob 或对象转换为 GCS 中的文件。我找不到很多例子,所以不确定过去是否有其他人解决过这个问题。

const { Storage } = require('@google-cloud/storage');
const storage = new Storage({
  projectId,
  keyFilename
 });

function uploadCSVToGCS() {
   const localFilePath = './test.csv';
   const bucketName = "Test_Bucket";
   const bucket = storage.bucket(bucketName);

   bucket.upload(localFilePath);
};

我还发现了一个谷歌引用的名为“boto”的第三方插件,它似乎可以满足我的需求,但不幸的是,这是针对 python 的,而不是针对 node.js 的。

标签: node.jsuploadgoogle-cloud-functionsgoogle-cloud-storage

解决方案


文档中说明了将对象数据流式传输到 Cloud Storage 。您将需要了解节点流的工作原理,并使用createWriteStream。示例代码并不完全符合您的要求,但您将使用相同的模式:

function sendUploadToGCS (req, res, next) {
  if (!req.file) {
    return next();
  }

  const gcsname = Date.now() + req.file.originalname;
  const file = bucket.file(gcsname);

  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    },
    resumable: false
  });

  stream.on('error', (err) => {
    req.file.cloudStorageError = err;
    next(err);
  });

  stream.on('finish', () => {
    req.file.cloudStorageObject = gcsname;
    file.makePublic().then(() => {
      req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
      next();
    });
  });

  stream.end(req.file.buffer);
}

推荐阅读