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 和作業系統的安全性修補程式有無

政策沒有說明函式何時會遭到停用。即使是現在運作正常的函式,一到要修正錯誤的時候也無法部署,而且無法預知它何時會停止運作。也沒有繞過的方法。即使關閉 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、可呼叫和工作佇列函式的新名稱就是新網址。先把應用程式和 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 代函式建構,執行階段停用後可能會停止執行或遭到停用。如果是要繼續使用的功能,也請規劃改用自己編寫的函式。

資料來源

所有文章 →