You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js环境下如何从Cloud Functions上传CSV文件至Cloud Storage?

Cloud Function生成CSV并上传Cloud Storage报错问题

问题描述

尝试在Cloud Function中将对象生成的CSV文件上传至Cloud Storage存储桶,使用@google-cloud/storage库处理上传操作,CSV文件已保存至Cloud Function实例的tmp文件夹,但执行时报超时错误。

当前实现代码

const saveCsv = async () => {
  const { Storage } = require('@google-cloud/storage');
  const createCsvWriter = require('csv-writer').createObjectCsvWriter;

  const data = [
    {
      name: 'John',
      surname: 'Doe',
      age: 35,
      gender: 'M',
      city: 'New York',
    },
    {
      name: 'Jane',
      surname: 'Doe',
      age: 28,
      gender: 'F',
      city: 'Los Angeles',
    },
  ];

  const csvPath = '/tmp/output.csv';
  const csvWriter = createCsvWriter({
    path: csvPath,
    header: [
      { id: 'orderNumber', title: 'orderNumber' },
      { id: 'zipcode', title: 'zipcode' },
      { id: 'address', title: 'address' },
      { id: 'phoneNumber', title: 'phoneNumber' },
      { id: 'name', title: 'name' },
    ],
  });
  csvWriter.writeRecords(data);

  const storage = new Storage();
  const bucketName = 'order_numbers';

  storage.bucket(bucketName).upload(csvPath);
};


exports.uploadToDrive = functions
  .https.onRequest(async (req, res) => {
    await save(todayIntentData);
});

执行结果

Function execution took 60001 ms, finished with status: 'error'

问题分析与修复方案

核心问题

  1. 异步操作未等待:csvWriter.writeRecords(data)和storage.bucket().upload()都是异步Promise操作,未加await会导致函数提前退出,操作未完成就触发超时。
  2. 函数调用错误:HTTP触发器中调用的save(todayIntentData)不存在,应为saveCsv(),且未传对应参数。
  3. 数据与表头不匹配:数据源data的字段(name、surname等)和CSV表头定义的id(orderNumber、zipcode等)不对应,会导致CSV生成异常。
  4. 缺少错误处理:无try/catch捕获异常,无法定位具体错误原因。

修复后的代码

const { Storage } = require('@google-cloud/storage');
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const functions = require('firebase-functions'); // 确保引入functions

const saveCsv = async () => {
  // 调整数据字段与表头匹配,或修改表头对应现有字段
  const data = [
    {
      name: 'John',
      orderNumber: 'ORD001',
      zipcode: '10001',
      address: '123 Main St',
      phoneNumber: '555-1234'
    },
    {
      name: 'Jane',
      orderNumber: 'ORD002',
      zipcode: '90001',
      address: '456 Oak Ave',
      phoneNumber: '555-5678'
    },
  ];

  const csvPath = '/tmp/output.csv';
  const csvWriter = createCsvWriter({
    path: csvPath,
    header: [
      { id: 'orderNumber', title: 'orderNumber' },
      { id: 'zipcode', title: 'zipcode' },
      { id: 'address', title: 'address' },
      { id: 'phoneNumber', title: 'phoneNumber' },
      { id: 'name', title: 'name' },
    ],
  });

  // 等待CSV写入完成
  await csvWriter.writeRecords(data);
  functions.logger.info('CSV文件生成完成');

  const storage = new Storage();
  const bucketName = 'order_numbers';

  // 等待文件上传完成
  await storage.bucket(bucketName).upload(csvPath, {
    gzip: true, // 可选:启用压缩
    metadata: {
      cacheControl: 'public, max-age=31536000',
    },
  });
  functions.logger.info('文件已上传至Cloud Storage');
};

exports.uploadToDrive = functions.https.onRequest(async (req, res) => {
  try {
    await saveCsv();
    res.status(200).send('CSV上传成功');
  } catch (error) {
    functions.logger.error('上传失败:', error);
    res.status(500).send(`上传失败: ${error.message}`);
  }
});

额外注意事项

  • 确保Cloud Function服务账号拥有storage.objects.create权限,可通过IAM角色配置(如Storage Object Creator)。
  • /tmp目录是Cloud Function的临时存储,文件大小不能超过实例内存限制(默认256MB)。

内容的提问来源于stack exchange,提问作者jack_sunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:57:06