node.js - 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 的。
解决方案
文档中说明了将对象数据流式传输到 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);
}
推荐阅读
- c++ - 链表。如何删除列表中的第一个节点?
- react-native - Expo AuthSession 替代方案
- node.js - 使用 POST API 时出现多个 CORS 错误
- git - 将事物合并到生产/发布分支的正确方法是什么?
- python - 遍历目录的文件夹并在python中的每个文件夹之后创建一个输出
- c# - c# 将 WPF 与在线数据库连接
- c# - 在两个类实例之间动态复制某些属性
- javascript - 重音符号在 IE 中显示错误
- asp.net - How to hide all year in datepicker except a year before today in ext.net
- gnuplot - Gnuplot - xtics 不同于网格