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

Firebase Functions部署报错:代码库分析失败的排查与解决求助

Firebase Functions部署报错排查求助

部署Firebase Functions时遇到如下报错:

Error: Functions codebase could not be analyzed successfully. It may have a syntax or runtime error.

已确认代码无语法错误、所需API已启用,但报错仍存在。相关代码片段:

export const readTarjeta = functions.storage.object().onFinalize(async (object) => {
    const imageBucket = `gs://${object.bucket}/${object.name}`;
    const client = new vision.ImageAnnotatorClient();

    const [textDetection] = await client.textDetection(imageBucket);
    const [annotation] = textDetection.textAnnotations;
    const text = annotation ? annotation.description : "";
    logger.log(text);

   const re = /(.*)\/;
   const uid = re.exec(object.name)[1];

  const regexArray = [
    // /(?<=PROPIETARIO?)\s*(.*)\n/,
    /\bJ[a-zA-Z0-9]{6}\b/gm,
    /(?<=MODELO)\s*(.*)\n/,
    /[a-zA-Z0-9]{17}$\n/gm,
];

let regExpSalto = /propietario:\s*\n/i;

 let propietario;
 let placasJ;
 let marcaJ;
 let anio;
 let modeloJ;
 let motorJ;
 let nivJ;
 
    if(regExpSalto.test(text)){
        let regExpBajo = /propietario:\s*\n\s*((\w+\s){3,4})\s+/i;
        if(regExpBajo.test(text)){
            let matches2 = text.match(regExpBajo);
            if(matches2){
                  propietario = matches2[1];
            }
        }else{

            let a = "Propietario:\\s+"
            let b = "(( +\\w+){3,5}\\*\n)"
            let saltoLinea = ".+\s+"
            let saltoLinea2 = "";
            
            
            let tes = "";
            let testeo = new RegExp();
            let condicion;

            let i = 0;

            while(!condicion && i <= 7){
                saltoLinea2 += saltoLinea;

                tes = a+saltoLinea2+b;
                testeo = RegExp(tes,"i")
                condicion = testeo.test(text)
                
                let matches = text.match(testeo);

                    if(matches){
                         propietario = matches[1];
                        
                    }
                i++;
            }
        }
    }else{
        let regExp = /PROPIETARIO:\s*([^\n\r]+)/;
        let matches = text.match(regExp);
        if(matches){
              propietario = matches[1];
              
        }else{
            propietario = "no se encontro el nombre del propietario"
        }
    }

    let regExpModelo = /\s+(\d{4})\n/;
    let matchesModelo = text.match(regExpModelo);
    if (matchesModelo) {
        anio = matchesModelo[1];
    } else {
        anio = "No se encontró el modelo del vehiculo";
    }

    let regExpPlacas = /\s(\w{3}\d{3,4})\n/;
    let matchesPlacas = text.match(regExpPlacas);
    if (matchesPlacas) {
        placasJ = matchesPlacas[1];
    } else {
        placasJ = "No se encontraron las placas del vehículo";
    }

        marcaJ = todasLasMarcas.find((marca) => {
          const regexMarca = new RegExp(`^\\s*\\b${marca}\\b`, 'im');
            return regexMarca.test(text);
          });
          
          if (!marcaJ) {
            marcaJ = "No se encontró la marca";
          }
          
        const lineas = text.split('\n').slice(7); 

        modeloJ = todosLosModelos.find((modelo) => {
            const regexModelo = new RegExp(`^\\s*\\b${modelo}\\b`, 'im');
            return lineas.some((linea) => regexModelo.test(linea));
          });
        
          if (!modeloJ) {
            modeloJ = "No se encontró el modelo";
          }



            const regexMotor = /[NUM]*[No.]*\s*MOTOR:\s*([\w-]{5,20})/i;
            const matchMotor = text.match(regexMotor);

            if (matchMotor) {
                const numeroMotor = matchMotor[1];
                motorJ = numeroMotor;
            } else {
                motorJ = "No se encontró el número de motor en el texto";
            }

            let regexpNiv = /\b[A-HJ-NPR-Z0-9]{17}\b/i; //Omite O, Q y I
            let matchesNiv = text.match(regexpNiv);
            if (matchesNiv) {
                nivJ = matchesNiv[0];
                
            } else {
                nivJ="No se encontraron coincidencias para el NIV";
            }

const fields = {
  // owner: "",
  // placas: "",
  // modelo: "",
  // serie: "",
};

for (let i = 0; i < regexArray.length; i++) {
  const regex = regexArray[i];
  const match = text.match(regex);
  if (match) {
      const fieldName = Object.keys(fields)[i];
      fields[fieldName] = match[0]?.trim()?.replace(/^(\w+:)/, '');
  }
}
const car ={
  owner: propietario,
  placas: placasJ,
  serie: nivJ, // Use serie or modelo if serie is not found
  year: anio,
  brand: marcaJ,
  model: modeloJ,
  motor: motorJ,
  isConfirmed: false,
  userUid:uid,
  imageBucket
}

  logger.log(car)

  admin.firestore().collection("Cars").add(car);
  logger.log(car);
})
可能的原因及解决方法

1. 正则表达式语法未闭合

代码中const re = /(.*)\/;的正则缺少闭合的反斜杠,正确写法应为const re = /(.*)\//;。这个语法错误会直接导致代码分析失败,是首要修复点。

2. 未定义变量引用

代码中使用了todasLasMarcas和todosLosModelos两个变量,但未显示其定义或导入逻辑。Firebase部署时无法解析未定义变量,会触发分析错误。

  • 修复:确保这两个变量已通过导入或本地初始化的方式正确定义。

3. 异步操作未处理

admin.firestore().collection("Cars").add(car)是异步操作,但未用await等待完成,也没有异常捕获逻辑。虽然不一定直接导致部署失败,但可能触发潜在的运行时错误,同时Firebase代码分析可能检测到该问题。

  • 修复:添加await并包裹在try/catch块中:
try {
  await admin.firestore().collection("Cars").add(car);
  logger.log("车辆数据已成功添加");
} catch (error) {
  logger.error("添加车辆数据失败:", error);
}

4. 依赖缺失或版本不兼容

检查package.json是否安装了@google-cloud/vision、firebase-admin、firebase-functions等依赖,且版本与当前Firebase CLI兼容。

  • 修复:执行npm install重新安装依赖,确保版本匹配。

5. Firebase CLI版本过旧

旧版本CLI可能无法正确解析新版本Node.js语法或Functions特性。

  • 修复:更新CLI到最新版本:npm install -g firebase-tools。

6. 正则转义字符错误

代码中let b = "(( +\\w+){3,5}\\*\n)"的\\*存在转义问题,若要匹配星号需确保转义正确,若为笔误则需修正。错误的转义会导致正则语法失效。

7. 本地测试未覆盖全部分支

部分代码分支(如while循环内的正则构建逻辑)可能未在本地测试中触发,潜在错误未被发现。

  • 修复:使用firebase emulators:start启动本地模拟器,触发函数执行所有分支,排查运行时错误。

内容的提问来源于stack exchange,提问作者JUAN OCTAVIO OCEGUEDA TRINIDAD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:16:56