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

版本升级后Firebase函数部署检测失败及加载问题求助

问题解决:Firebase Functions升级后部署异常及迁移方案

核心问题分析

  1. 旧依赖编译错误:你的TypeScript 3.8版本不支持@types/express-serve-static-core中使用的模板字符串类型(TypeScript 4.1+新增特性),导致批量编译失败。
  2. 函数检测不到/加载失败:
    • 升级到Firebase Functions v4.x后,package.json中engines.node仍指定为10,但v4.x已不再支持Node.js 10,依赖与运行环境不兼容直接导致函数加载失败。
    • 部署时的函数检测逻辑依赖本地代码正确导出函数,同时新SDK对函数定义的兼容性有调整。

可正常部署的配置及修复步骤

1. 更新package.json(适配Node.js 18 + Firebase Functions v4)

{
  "name": "functions",
  "scripts": {
    "lint": "eslint . --ext .ts",
    "build": "tsc",
    "serve": "npm run build && firebase emulators:start --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "18"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^11.11.0",
    "firebase-functions": "^4.5.0",
    "nodemailer": "^6.9.7"
  },
  "devDependencies": {
    "@types/node": "^20.9.0",
    "@types/nodemailer": "^6.4.13",
    "@typescript-eslint/eslint-plugin": "^6.11.0",
    "@typescript-eslint/parser": "^6.11.0",
    "eslint": "^8.53.0",
    "firebase-functions-test": "^3.1.0",
    "typescript": "^5.2.2"
  },
  "private": true
}

说明:

  • 移除已废弃的tslint,改用ESLint做代码检查
  • 将Node.js版本升级到18(当前Firebase官方支持的LTS版本)
  • 同步最新兼容的firebase-admin、firebase-functions及TypeScript版本
  • 移除冗余的nodemailer-direct-transport/smtp-transport类型依赖,@types/nodemailer已包含相关定义

2. 调整tsconfig.json(适配TS5.x)

确保配置符合Node.js 18及Functions运行要求:

{
  "compilerOptions": {
    "module": "commonjs",
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "outDir": "lib",
    "sourceMap": true,
    "strict": true,
    "target": "ES2020",
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "compileOnSave": true,
  "include": [
    "src/**/*.ts"
  ]
}

注意:如果你的函数代码在根目录而非src文件夹,将include字段改为["*.ts"]

3. 修复函数定义与部署逻辑

  • 同时保留旧函数并添加新函数:确保index.ts中正确导出两个函数,示例如下:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as nodemailer from 'nodemailer';

admin.initializeApp();

// 旧联系表单邮件函数
export const sendContactFormEmail = functions.region('europe-west3').firestore
  .document('contactPosts/{postId}')
  .onWrite(async (change, context) => {
    // 原有邮件发送逻辑
  });

// 新增求职申请表单邮件函数
export const sendApplicationFormEmail = functions.region('europe-west3').firestore
  .document('applicationPosts/{postId}')
  .onWrite(async (change, context) => {
    // 复用联系表单的邮件发送逻辑
  });
  • 部署命令调整:
    • 同时更新旧函数并部署新函数:
      firebase deploy --project company-website --only functions
      
    • 仅部署新函数:
      firebase deploy --project company-website --only functions:sendApplicationFormEmail
      

4. 本地环境验证

  • 先清理旧依赖和编译产物,重新安装依赖并编译:
cd functions
rm -rf node_modules lib
npm install
npm run build
  • 使用模拟器测试函数是否正常运行:
npm run serve

关键注意事项

  • Node.js 10已被Firebase官方废弃,必须升级到14/16/18版本,否则无法兼容最新的Functions SDK。
  • 确保本地firebase-tools为最新版本,运行npm install -g firebase-tools完成更新。
  • 如果部署时仍提示函数不存在,检查:
    • 函数是否在index.ts中正确导出
    • tsconfig.json的include路径是否覆盖了函数文件
    • 编译后的lib/index.js中是否存在对应的函数导出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:05:25