Cloud Run 函数在由操作系统版本、插件软件包、语言支持以及支持和调用函数的 Node.js 版 Functions 框架库组成的环境中运行。此环境由语言版本进行标识,称为运行时 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 页面。
点击编写函数。
在运行时列表中,选择一个 Node.js 运行时版本。
点击创建,然后等待 Cloud Run 使用占位符修订版创建服务。
控制台会将您重定向到来源标签页,您可以在其中查看函数的源代码。点击保存并重新部署。
如需详细了解如何在函数部署后更新运行时版本,请参阅重新部署新源代码。
源代码结构
为了让 Cloud Run functions 找到函数的定义,源代码必须遵循特定结构。如需了解详情,请参阅编写 Cloud Run 函数。
指定依赖项
如需为您的函数指定依赖项,您可以在 package.json
文件中列出这些依赖项。如需了解详情,请参阅指定 Node.js 依赖项。
NPM 构建脚本
默认情况下,如果 package.json
中检测到 build
脚本,则 Node.js 运行时会执行 npm run build
。如果您需要在启动应用之前对构建步骤进行额外的控制,则可以通过向 package.json
文件添加 gcp-build
脚本来提供自定义构建步骤。
您可以通过以下任一方式阻止构建运行 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)是 Node.js 14+ 中用于加载 JavaScript 模块的 TC39 标准、未标记功能。与 CommonJS 不同,ESM 提供了一个用于加载模块的异步 API。它还通过可在 Cloud Run 函数中使用的 import
和 export
语句(而不是 require
语句)提供常见的语法改进。
如需在 Cloud Run 函数中使用 ESM,您必须在 package.json
中声明 "type": "module"
。
{
...
"type": "module",
...
}
然后,您可以使用 import
和 export
语句。
详细了解如何使用 ES 模块。