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

如何将HTTP触发的Azure函数与Azure Table Storage关联并存储数据

实现Azure函数将处理后的JSON存入Table Storage并返回响应

完整修改后的代码

const axios = require('axios');
const azureStorage = require('azure-storage');

// 初始化Table Storage服务
const tableService = azureStorage.createTableService(process.env.connectionString);
const tableName = 'YourTableName'; // 替换成你的Table名称

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    // 获取请求中的URL参数(支持查询字符串或请求体)
    const targetUrl = req.query.url || (req.body && req.body.url);
    const sourceName = req.query.name || (req.body && req.body.name);

    if (!targetUrl) {
        context.res = {
            status: 400,
            body: "请在查询字符串或请求体中传入url参数"
        };
        return;
    }

    try {
        // 1. 获取并解析数据为JSON
        const parsedJson = await getData(targetUrl);
        const parsedData = JSON.parse(parsedJson); // 解析为对象,方便存入Table

        // 2. 将解析后的数据存入Table Storage(确保await完成后再返回响应)
        const saveStatus = await saveDataOnTable(parsedData, sourceName);

        // 3. 返回响应
        context.res = {
            status: 200,
            body: {
                textParsed: parsedJson,
                statusTable: saveStatus,
                message: "数据处理并保存成功"
            }
        };
    } catch (error) {
        context.log.error('处理过程出错:', error);
        context.res = {
            status: 500,
            body: {
                error: error.message,
                message: "数据处理或保存失败"
            }
        };
    }
}

async function getData(url) {
    const response = await axios.get(url);
    return csvJSON(response.data);
}

async function csvJSON(csv) {
    const regularQuotes = /\"/g;
    const csvArray = csv.split("\r\n");
    const headers = csvArray[0].split(",").map(h => h.trim());
    const result = [];

    for (let index = 1; index < csvArray.length; index++) {
        const currentLine = csvArray[index].trim();
        if (!currentLine) continue;

        // 处理包含逗号的字段(简单版,若CSV有复杂嵌套引号建议用专业库如csv-parser)
        let cleanedLine = currentLine.replace(regularQuotes, '');
        const fields = cleanedLine.split(",");
        
        const obj = {};
        for (let j = 0; j < headers.length; j++) {
            obj[headers[j]] = fields[j]?.trim() || '';
        }
        result.push(obj);
    }
    return JSON.stringify(result);
}

async function saveDataOnTable(dataArray, sourceName) {
    // 确保Table存在,不存在则创建
    await new Promise((resolve, reject) => {
        tableService.createTableIfNotExists(tableName, (error, result, response) => {
            if (error) reject(error);
            else resolve(result);
        });
    });

    // 批量插入数据(若数据量大建议用batch操作,这里单条插入示例)
    const insertPromises = dataArray.map((item, index) => {
        // Table Storage必须的PartitionKey和RowKey
        const entity = {
            PartitionKey: sourceName || 'DefaultPartition', // 用来源名称作为分区键,或自定义
            RowKey: `${Date.now()}_${index}`, // 时间戳+索引确保唯一
            ...item // 把CSV解析的字段加入实体
        };

        return new Promise((resolve, reject) => {
            tableService.insertEntity(tableName, entity, (error, result, response) => {
                if (error) {
                    context.log.error('插入实体失败:', error);
                    reject(error);
                } else {
                    resolve(result);
                }
            });
        });
    });

    await Promise.all(insertPromises);
    return `成功保存${insertPromises.length}条数据到Table Storage`;
}

关键改动说明

  • 初始化Table Service:在函数外部创建tableService实例,复用连接,避免每次请求重新初始化。
  • 完善参数校验:增加targetUrl的判断,缺少时返回400错误,避免后续逻辑报错。
  • 确保保存操作完成:在主函数中先await getData获取解析后的数据,再await saveDataOnTable,保证数据存入Table后再返回响应。
  • 实现Table存储逻辑:
    • saveDataOnTable函数先确保目标Table存在,不存在则自动创建。
    • 为每个生成的JSON对象添加必须的PartitionKey和RowKey(Table Storage的强制要求),这里用来源名称作为分区键,时间戳+索引作为唯一行键。
    • 用Promise.all批量插入数据,提升效率。
  • 错误处理:用try/catch包裹整个流程,捕获数据获取、解析、存储过程中的错误,返回500状态码和错误信息。
  • 修复原有代码问题:
    • 修正getData函数中冗余的then,直接用await axios.get。
    • 修复csvJSON中字段处理的细节,比如处理fields[j]可能为undefined的情况。
    • 修正原有代码中错误引用req.body.name的问题,改用sourceName变量。

注意事项

  1. 环境变量配置:确保在Azure函数的应用设置中配置connectionString,值为你的Azure Storage账户连接字符串。
  2. Table名称替换:把代码中的YourTableName替换为你实际要使用的Table名称。
  3. CSV解析优化:如果你的CSV包含带逗号的字段(比如"Doe, John"),当前的简单分割逻辑会出错,建议使用专业的CSV解析库如csv-parser,安装后替换csvJSON函数的实现。
  4. 批量操作限制:Azure Table Storage的批量操作最多支持100个实体,若你的CSV数据超过100行,需要拆分批次插入。

内容的提问来源于stack exchange,提问作者carlos eduardo grageda flores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:30:49