Cloud Run 函式會在包含附加程式套件、語言支援的作業系統版本,以及支援及叫用函式的 Node.js 函式架構程式庫的環境中執行。這個環境會透過語言版本識別,稱為「執行階段 ID」。
函式準備
您可以直接在 Google Cloud 控制台中準備函式,也可以在本機上編寫函式並上傳。如要為 Node.js 開發作業準備本機電腦,請參閱「設定 Node.js 開發環境」一文。
支援的 Node.js 執行階段和基本映像檔
執行階段 | 執行階段 ID | 堆疊 | 執行階段基本映像檔 |
---|---|---|---|
Node.js 22 | nodejs22 |
|
|
Node.js 20 | nodejs20 |
|
|
Node.js 18 | nodejs18 |
|
|
Node.js 16 | nodejs16 | google-18-full | google-18-full/nodejs16 |
Node.js 14 | nodejs14 | google-18-full | google-18-full/nodejs14 |
Node.js 12 | nodejs12 | google-18-full | google-18-full/nodejs12 |
Node.js 10 | nodejs10 | google-18-full | google-18-full/nodejs10 |
Node.js 8 | nodejs8 | 已停用 | 已停用 |
Node.js 6 | nodejs6 | 已停用 | 已停用 |
選取執行階段
您可以在部署期間,針對函式選取所支援的 Node.js 執行階段。
您可以使用 Google Cloud 控制台或 gcloud CLI 選取執行階段版本。按一下分頁標籤,瞭解如何使用自選工具:
gcloud
在部署函式時,請使用 --base-image
標記指定函式的 Node.js 基礎映像檔。例如:
gcloud run deploy FUNCTION \
--source . \
--function FUNCTION_ENTRYPOINT \
--base-image nodejs22
取代:
FUNCTION 替換為您要部署的函式名稱。您可以將這個參數完全省略,這樣系統會提示您輸入名稱。
FUNCTION_ENTRYPOINT 與原始碼中函式的進入點。這是 Cloud Run 在函式執行時執行的程式碼。這個標記的值必須是來源程式碼中存在的函式名稱或完全限定的類別名稱。
如需使用 gcloud CLI 部署函式的詳細操作說明,請參閱「在 Cloud Run 中部署函式」。
主控台
您可以在 Google Cloud 控制台中建立或更新 Cloud Run 函式時,選取執行階段版本。如需部署函式的詳細操作說明,請參閱「在 Cloud Run 中部署函式」。
如要在建立函式時在 Google Cloud 控制台中選取執行階段,請按照下列步驟操作:
前往 Google Cloud 控制台的「Cloud Run」頁面:
按一下「編寫函式」。
在「Runtime」清單中,選取 Node.js 執行階段版本。
按一下「Create」(建立),然後等待 Cloud Run 使用預留位置修訂版本建立服務。
主控台會將您重新導向至「來源」分頁,您可以在該分頁中查看函式的原始碼。按一下「儲存並重新部署」。
如需有關在函式部署後更新執行階段版本的詳細操作說明,請參閱「重新部署新原始碼」。
原始碼結構
如要讓 Cloud Run 函式找到函式定義,您的原始碼必須遵循特定結構。詳情請參閱「編寫 Cloud Run 函式」。
指定依附元件
您可以在 package.json
檔案中列出依附元件,以便為函式指定依附元件。詳情請參閱「在 Node.js 中指定依附元件」。
NPM 建構指令碼
根據預設,如果在 package.json
中偵測到 build
指令碼,Node.js 執行階段就會執行 npm run build
。如果您需要在啟動應用程式之前進一步控制建構步驟,可以將 gcp-build
指令碼新增至 package.json
檔案,藉此提供自訂建構步驟。
您可以透過下列任一方式,防止建構作業執行 npm run build
指令碼:
在
package.json
檔案中新增gcp-build
指令碼,並在其中加入空值:"gcp-build":""
。將建構環境變數
GOOGLE_NODE_RUN_SCRIPTS
設為空字串,以防止所有指令碼執行。
非同步函式完成
使用涉及回呼或 Promise
物件的非同步工作時,您必須明確通知執行階段,您的函式已完成執行這些工作。您可以透過多種方式執行此操作,如以下範例所示。重點是,程式碼必須等待非同步工作或 Promise
完成,才能傳回;否則,函式中的非同步元件可能會在完成前終止。
事件導向函式
隱含傳回
exports.implicitlyReturning = async (event, context) => {
return await asyncFunctionThatReturnsAPromise();
};
明確的傳回值
exports.explicitlyReturning = function (event, context) {
return asyncFunctionThatReturnsAPromise();
};
HTTP 函式
使用中介軟體處理 HTTP 要求
Node.js HTTP 函式提供與 ExpressJS 相容的 request
和 response
物件,可簡化耗時的 HTTP 要求。Cloud Run 函式會自動讀取要求主體,因此您一律會收到與媒體類型無關的要求主體。這表示,在執行程式碼時,應將 HTTP 要求視為已完全讀取。使用 ExpressJS 應用程式的巢狀結構時應注意這一點;具體而言,預期不會讀取要求主體的中介軟體可能無法如預期運作。
使用 ES 模組
ECMAScript 模組 (ES 模組或 ESM) 是 TC39 標準,是 Node 14 以上版本中未標記的功能,可用於載入 JavaScript 模組。與 CommonJS 不同,ESM 提供非同步 API 來載入模組。它還提供常見的語法改善功能,可使用 import
和 export
陳述式,在 Cloud Run 函式中使用 (而非 require
陳述式)。
如要在 Cloud Run 函式中使用 ESM,您必須在 package.json
中宣告 "type": "module"
。
{
...
"type": "module",
...
}
即可使用 import
和 export
陳述式。
進一步瞭解如何使用 ES 模組。