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

Firebase定时云函数部署失败求助,旧代码无法正常部署

Firebase定时云函数部署失败排查指南

问题情况

之前能正常运行的Firebase定时云函数,现在部署相同代码却失败了。核对过官方文档,没发现属性名变更,代码逻辑也符合要求,下面是相关代码、错误信息和日志,整理了几个排查方向。

函数代码

const functions = require("firebase-functions");
const axios = require("axios");
const admin = require("firebase-admin");
admin.initializeApp();
const database = admin.firestore();
const page = 1;
const fiat = "RON";
const tradeType = "BUY";
const asset = "USDT";
const payTypes = ["ING"];
let finalData = [];
let tempDataBeforeProccessing = [];

const baseObj = {
  page,
  rows: 20,
  publisherType: null,
  asset,
  tradeType,
  fiat,
  payTypes,
};

const stringData = JSON.stringify(baseObj);

const getTheData = async function() {
  tempDataBeforeProccessing=[];
  await axios.post("https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search", baseObj, {
    hostname: "p2p.binance.com",
    port: 443,
    path: "/bapi/c2c/v2/friendly/c2c/adv/search",
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": stringData.length,
    },
  }).then((res)=>{
    tempDataBeforeProccessing=res.data.data;
  });
};


const processData = function() {
  finalData=[];
  let obj = [];
  for (let i = 0; i < tempDataBeforeProccessing.length; i++) {
    let payTypesz = "";
    for (let y = 0; y <
    tempDataBeforeProccessing[i]["adv"]["tradeMethods"].length; y++) {
      payTypesz +=
      tempDataBeforeProccessing[i]["adv"]["tradeMethods"][y]["identifier"];
      if (y <
      tempDataBeforeProccessing[i]["adv"]["tradeMethods"].length - 1) {
        payTypesz += ", ";
      }
    }
    obj = {
      tradeType: tempDataBeforeProccessing[i]["adv"]["tradeType"],
      asset: tempDataBeforeProccessing[i]["adv"]["asset"],
      fiatUnit: tempDataBeforeProccessing[i]["adv"]["fiatUnit"],
      price: tempDataBeforeProccessing[i]["adv"]["price"],
      surplusAmount:
      tempDataBeforeProccessing[i]["adv"]["surplusAmount"],
      maxSingleTransAmount:
      tempDataBeforeProccessing[i]["adv"]["maxSingleTransAmount"],
      minSingleTransAmount:
      tempDataBeforeProccessing[i]["adv"]["minSingleTransAmount"],
      nickName:
      tempDataBeforeProccessing[i]["advertiser"]["nickName"],
      monthOrderCount:
      tempDataBeforeProccessing[i]["advertiser"]["monthOrderCount"],
      monthFinishRate:
      tempDataBeforeProccessing[i]["advertiser"]["monthFinishRate"],
      payTypes: payTypesz,
    };
    finalData.push(obj);
  }

  console.log(finalData);
};

const entireCall = async function() {
  await getTheData();
  processData();
};

exports.scheduledFunction = functions.pubsub
      .schedule("every 1 minutes")
      .onRun(async (context) => {
        await database.collection("SebiBinanceSale").doc("BCR Bank").delete();
        await entireCall();
        for (let i = 0; i < finalData.length; i++) {
          await database.collection("SebiBinanceSale").doc("BCR Bank")
              .collection("1").doc(i.toString())
              .set({
                "tradeType": finalData[i]["tradeType"],
                "asset": finalData[i]["asset"],
                "fiatUnit": finalData[i]["fiatUnit"],
                "price": finalData[i]["price"],
                "surplusAmount": finalData[i]["surplusAmount"],
                "maxSingleTransAmount": finalData[i]["maxSingleTransAmount"],
                "minSingleTransAmount": finalData[i]["minSingleTransAmount"],
                "nickName": finalData[i]["nickName"],
                "monthOrderCount": finalData[i]["monthOrderCount"],
                "monthFinishRate": finalData[i]["monthFinishRate"],
                "payTypes": finalData[i]["payTypes"],
              });
        }
        return console.log("Succes Upload of the data ");
      });

错误信息

加载用户代码时函数执行失败,大概率是代码存在bug。错误提示:请查看函数日志了解具体原因。

部署出错的函数:
scheduledFunction(us-central1)
正在清理构建文件...

部署函数时发生错误

日志内容

[debug] [2022-10-29T17:40:16.776Z] 错误:更新us-central1区域的scheduledFunction函数失败
at /usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/release/fabricator.js:41:11
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at async Fabricator.updateV1Function (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/release/fabricator.js:305:32)
at async Fabricator.updateEndpoint (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/release/fabricator.js:140:13)
at async handle (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/release/fabricator.js:78:17)
[error]
[error] 部署函数时发生错误

排查方向

  • 锁死依赖版本:找之前能正常部署的package-lock.json或者版本记录,把firebase-functions、firebase-admin、axios的版本固定下来,重新npm install后再部署。新依赖版本经常会和旧代码有兼容性冲突。
  • 本地模拟器测报错:用firebase emulators:start启动本地模拟器,手动触发定时函数,看控制台输出的具体错误——部署时的提示太笼统,本地测试能拿到更细节的报错。
  • 检查权限配置:确认项目的服务账号有没有被改动,是否拥有Cloud Functions的部署权限,以及Firestore的读写权限是否正常。
  • 修复代码潜在问题:
    • getTheData里的axios请求没加错误处理,Binance接口请求失败直接就崩,加个.catch(err => { console.error('请求Binance接口失败:', err); })捕获错误。
    • 全局变量finalData和tempDataBeforeProccessing容易引发并发问题,云函数是无状态的,多个请求会互相干扰,把这俩变量移到entireCall函数内部。
    • 删除文档的操作没处理错误,删失败了后面写数据也跑不下去,加个try-catch包裹:try { await database.collection(...).delete(); } catch(err) { console.error('删除文档失败:', err); }
  • 核对firebase-tools版本:看看本地的firebase-tools是不是自动更新了,和之前部署的版本不一致的话,试试降级或升级到对应版本再部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:50:52