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-functions7 移除了functions.config(),firebase-admin14 只能在 Node.js 22 及更高版本上运行。SDK 版本
日期和含义
这是 Google Cloud 的运行时支持时间表。弃用(deprecation)期间仍可部署;停用(decommission)之后,既不能新建函数,也不能更新函数。
| 运行时 | 可用的函数 | 弃用 | 停用 |
|---|---|---|---|
| Node.js 18 | 第 1 代、第 2 代 | 2025-04-30 | 2025-10-30 |
| Node.js 20 | 第 1 代、第 2 代 | 2026-04-30 | 2026-10-30 |
| Node.js 22 | 第 1 代、第 2 代 | 2027-04-30 | 2027-10-31 |
| Node.js 24 | 仅第 2 代 | 2028-04-30 | 2028-10-31 |
停用后会有以下变化。
| 弃用期间 | 停用后 | |
|---|---|---|
| 新部署或更新 | 可以 | 不可以 |
| 已部署的函数 | 照常运行 | 仍会运行,但可能被禁用 |
| Node.js 和操作系统的安全补丁 | 有 | 无 |
政策中没有给出禁用的日期。即使是现在运行正常的函数,一到要修 bug 的时候也无法部署,而且无法预知它何时会停止运行。也没有绕过的办法。即使关闭 CLI 的运行时检查,服务器端也会另行拦截(CLI 源代码)。
升级到 Node.js 24 或 22
- 查看每个函数是第几代、用的什么运行时。运行
firebase functions:list:Version 列为v1表示第 1 代,为v2表示第 2 代;Runtime 列是当前的运行时。 - 选择版本。运行时不是按函数设置的,而是每个代码库(通常是
functions文件夹)一个。只要有一个第 1 代函数就选 22,全部是第 2 代就选 24。24 可以用到 2028 年 10 月 31 日,但不支持第 1 代。Firebase 文档的版本列表里还没有 24,不过 Google Cloud 的时间表已把它列为第 2 代可用,Firebase CLI 也从 14.26.0 起支持它。 - 修改
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" } } - 本地和 CI 的 Node.js 也要统一成同一版本。模拟器用本机安装的 Node.js 运行函数。版本不一致时,它只会给出
Your requested "node" version "24" doesn't match your global version "20"警告,然后照样用 20 运行,于是测试跑在与生产环境不同的版本上。 - 部署。运行
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-admin | 14 只能在 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 extensionsFirebase Extensions 服务将于 2027 年 3 月 31 日关停。已安装的扩展程序在此之后仍会运行,但无法再使用更新等管理功能。大多数扩展程序基于第 1 代函数构建,运行时停用后可能会停止运行或被禁用。如果是要继续使用的功能,也请规划好改用自己编写的函数。
资料来源
- 运行时支持时间表、Cloud Functions 版本说明:日期、弃用和停用的含义、第 1 代对 Node.js 22 和第 2 代对 Node.js 24 的支持
- 管理函数(设置 Node.js 版本)、Cloud Functions 常见问题解答:
engines和runtime、扩展程序的运行时 - Firebase CLI 15.35.0 源代码:运行时检查和错误消息、运行时日期、读取
engines、模拟器如何选择 Node.js、服务器端检查 - firebase-tools、firebase-functions、firebase-admin 14.0.0 的版本说明、环境配置
- 从第 1 代升级到第 2 代、版本比较、Authentication 触发器、扩展程序常见问题解答、extension.yaml 参考
