繁体   English   中英

Node.js Cloud Function-将CSV数据直接流式传输到Google Cloud Storage文件

[英]Node.js Cloud Function - Stream CSV data directly to Google Cloud Storage file

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

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

我在Google上找到了此“ Streaming Transfers”文档,但仅引用了“ gsutil”的用法,而我正努力寻找有关如何使用node.js进行操作的任何示例或文档。 我还尝试在Stack溢出时遵循此答案 ,但这是从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);
};

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

文档中说明了将对象数据流传输到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);
}

@ doug-stevenson感谢您将我推向正确的方向。 我能够将其与以下代码一起使用:

const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
const bucketName = 'test_bucket';
const blobName = 'test.csv';
const bucket = storage.bucket(bucketName);
const blob = bucket.file(blobName);
const request = require('request');


function pipeCSVToGCS(redirectUrl) {
      request.get(redirectUrl)
      .pipe(blob.createWriteStream({
          metadata: {
              contentType: 'text/csv'
          }
      }))
    .on("error", (err) => {
        console.error(`error occurred`);
    })
    .on('finish', () => {
        console.info(`success`);
    });
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM