Firexport博客

Cloud Functions for Firebase 的 Node.js 20 已停用:升级到 Node.js 24 或 22

Cloud Functions 的 Node.js 20 运行时已于 2026 年 10 月 30 日停用(decommission)。现在不能再用 Node.js 20 部署新函数或更新现有函数,所以 firebase deploy 会因下面的错误而停止。要改的只是 functions/package.json 中的一行。如果只有第 2 代函数,请升级到 Node.js 24;如果有第 1 代函数,请升级到 Node.js 22。

Error: Runtime Node.js 20 was decommissioned on 2026-10-30. To deploy you must
first upgrade your runtime version.

要点

  • 问题不只是无法部署。已部署的函数仍在运行,但不再有安全补丁,还可能被禁用,而且没有确定的日期。日期和含义
  • 改一行,重新部署。把 engines.node 改为 "24" 或 "22"。如果 firebase.json 中有 runtime,则以它为准。修改方法
  • 第 2 代用 24,第 1 代用 22。第 1 代函数最后能用的是 Node.js 22,所以必须在 22 停用的 2027 年 10 月 31 日之前迁移到第 2 代。第 1 代函数
  • 如果升级 SDK,要注意两点。firebase-functions 7 移除了 functions.config(),firebase-admin 14 只能在 Node.js 22 及更高版本上运行。SDK 版本

日期和含义

这是 Google Cloud 的运行时支持时间表。弃用(deprecation)期间仍可部署;停用(decommission)之后,既不能新建函数,也不能更新函数。

运行时可用的函数弃用停用
Node.js 18第 1 代、第 2 代2025-04-302025-10-30
Node.js 20第 1 代、第 2 代2026-04-302026-10-30
Node.js 22第 1 代、第 2 代2027-04-302027-10-31
Node.js 24仅第 2 代2028-04-302028-10-31

停用后会有以下变化。

弃用期间停用后
新部署或更新可以不可以
已部署的函数照常运行仍会运行,但可能被禁用
Node.js 和操作系统的安全补丁有无

政策中没有给出禁用的日期。即使是现在运行正常的函数,一到要修 bug 的时候也无法部署,而且无法预知它何时会停止运行。也没有绕过的办法。即使关闭 CLI 的运行时检查,服务器端也会另行拦截(CLI 源代码)。

升级到 Node.js 24 或 22

  1. 查看每个函数是第几代、用的什么运行时。运行 firebase functions:list:Version 列为 v1 表示第 1 代,为 v2 表示第 2 代;Runtime 列是当前的运行时。
  2. 选择版本。运行时不是按函数设置的,而是每个代码库(通常是 functions 文件夹)一个。只要有一个第 1 代函数就选 22,全部是第 2 代就选 24。24 可以用到 2028 年 10 月 31 日,但不支持第 1 代。Firebase 文档的版本列表里还没有 24,不过 Google Cloud 的时间表已把它列为第 2 代可用,Firebase CLI 也从 14.26.0 起支持它。
  3. 修改 package.json 中的一行。值是一个主版本号。如果写成 >=22 或 22.x 这样的范围,CLI 会报 Detected node engine ... which is not a supported version 错误。
    {
      "engines": {
        "node": "24"
      }
    }

    如果 firebase.json 中有 runtime,CLI 会优先使用它的值。这时请改那里。

    {
      "functions": {
        "source": "functions",
        "runtime": "nodejs24"
      }
    }
  4. 本地和 CI 的 Node.js 也要统一成同一版本。模拟器用本机安装的 Node.js 运行函数。版本不一致时,它只会给出 Your requested "node" version "24" doesn't match your global version "20" 警告,然后照样用 20 运行,于是测试跑在与生产环境不同的版本上。
  5. 部署。运行 firebase deploy --only functions,然后确认 firebase functions:list 的 Runtime 列已变为 nodejs24(或 nodejs22)。

SDK 版本

如果在升级 Node.js 的同时也升级 SDK,请确认以下几点。

软件包要确认的内容
firebase-tools(CLI)从 13.11.0 起可部署 nodejs22,从 14.26.0 起可部署 nodejs24。
firebase-functions低于 6.2.0 的版本中,含顶层 await 的 ESM 代码在 Node.js 22.12 及更高版本上会出错。7.0.0 移除了 functions.config(),调用它会抛出运行时错误。
firebase-admin14 只能在 Node.js 22 及更高版本上运行,并且必须与 firebase-functions 7.3.0 或更高版本一起使用(peer 依赖项)。13 可在 Node.js 18 及更高版本上运行。

如果还在用 functions.config(),请把 firebase-functions 保持在 6.x,只升级 Node.js。2027 年 3 月之后,使用 functions.config() 的部署也会失败,所以在那之前要迁移到环境变量或 Secret Manager。

第 1 代函数

第 1 代函数能用的最后一个运行时是 Node.js 22,而 22 将于 2027 年 10 月 31 日停用。在那之前必须迁移到第 2 代。Firebase CLI 15.35.0 的警告把 22 的停用日期显示为 2028-10-31,但应以 Google Cloud 运行时支持时间表上的 2027-10-31 为准(CLI 源代码)。函数不能在同名的情况下直接切换,所以 Firebase 建议用新名称部署第 2 代函数,把流量迁移过去后,再删除第 1 代函数(升级指南)。迁移时容易遇到的问题如下。

  • 网址会变。HTTP、Callable 和任务队列函数的新名称就是新网址。先把应用和 Webhook 改为使用新网址,再用 firebase functions:delete 删除旧函数。
  • 事件会处理两次。在两个函数并存期间,Firestore、Storage 等事件触发器会让两个函数都针对同一个事件执行。请确保执行两次的结果也相同。
  • 有些功能没有。第 2 代没有 functions.config() 和 Analytics 事件触发器,Authentication 的用户创建和删除触发器(onUserCreated、onUserDeleted)仍处于预览版阶段(Preview)。
  • 默认值不同。一个实例默认最多同时处理 80 个请求,默认服务账号也换成了 Compute Engine 默认服务账号。如果你在全局变量中存放随请求而变的值,或者把 IAM 权限授予了 App Engine 默认服务账号,就需要修改。

扩展程序(Extensions)

已安装的扩展程序同样运行在 Cloud Functions 上,其运行时由扩展程序的版本决定。Firebase 建议把扩展程序更新到最新版本。

firebase ext:update <instance-id>
firebase deploy --only extensions

Firebase Extensions 服务将于 2027 年 3 月 31 日关停。已安装的扩展程序在此之后仍会运行,但无法再使用更新等管理功能。大多数扩展程序基于第 1 代函数构建,运行时停用后可能会停止运行或被禁用。如果是要继续使用的功能,也请规划好改用自己编写的函数。

资料来源

全部文章 →