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

