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

Azure Function返回旧结果问题排查求助

Azure Function生成Blob文件名时间不更新的原因及修复方案

核心原因是模块级时间变量未在每次函数触发时重新计算,结合Azure Function的热启动机制导致旧时间被复用:

  • 你代码中的start_time、end_time、time_now都是定义在模块顶级作用域的变量,这些变量仅在函数首次冷启动(比如部署后第一次运行)时执行DateTime.now()初始化一次。
  • Azure Function为了提升性能,会保持函数实例存活(热启动),后续触发时不会重新加载整个模块,直接复用已初始化的变量值,导致时间始终停留在首次启动的时刻。
  • 本地运行时每次都是全新启动模块,所以时间会实时更新;GitHub提交后触发重新部署,函数实例重新冷启动,第一次运行时间正常,但后续热启动又回到旧值。

修复方案

将时间变量的定义移到函数内部,确保每次触发函数时都重新获取当前时间:

const { DateTime } = require("luxon");
const { BlobServiceClient } = require("@azure/storage-blob");
const XLSX = require("xlsx");

async function uploadFileToBlobStorage(filename, json) {
  // 将时间计算逻辑移到函数内部,每次调用都会重新执行
  const start_time = DateTime.now()
    .set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
    .minus({ days: 1 });

  const end_time = DateTime.now()
    .set({ hour: 23, minute: 59, second: 59, millisecond: 999 })
    .minus({ days: 1 });

  const time_now = DateTime.now();

  const connectionString = process.env.blobStorageConnectionString;
  const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
  const containerName = process.env.blobContainer;
  const containerClient = blobServiceClient.getContainerClient(containerName);

  const worksheet = XLSX.utils.json_to_sheet(json);
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");

  const excelBuffer = XLSX.write(workbook, {
    type: "buffer",
    bookType: "xlsx",
  });

  const blobName = `${time_now
    .minus({ days: 1 })
    .toFormat("yyyy-LL-dd-hh-mm-ss")}_${filename}.xlsx`;

  const blockBlobClient = containerClient.getBlockBlobClient(blobName);

  await blockBlobClient.uploadData(excelBuffer, {
    blobHTTPHeaders: {
      blobContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    },
  });
}

额外注意

  • 如果start_time和end_time用于数据查询的时间范围,同样需要确保每次调用都重新计算,避免查询旧时段的数据。
  • 若你的Function App开启了"始终启用"配置(Azure Portal -> 函数应用 -> 配置 -> 常规设置),函数实例会长期存活,热启动的概率更高,这类问题会更频繁出现,修复后可彻底解决此问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:07:37