Node.js 运行时

Cloud Run 函数在由操作系统版本、插件软件包、语言支持以及支持和调用函数的 Functions 框架库组成的环境中运行。此环境由语言版本进行标识,称为运行时。

如需了解运行时的一般信息以及每个 Node.js 运行时使用的 Ubuntu 版本,请参阅 Cloud Run 函数执行环境

如需开始使用 Node.js 构建和部署 Cloud Run functions 函数,请参阅快速入门

如需在本地系统上构建和测试函数,请参阅使用 Functions 框架运行函数

选择运行时

Cloud Run functions 函数支持运行时支持页面上列出的多个 Node.js 版本。您可以在部署期间为您的函数选择首选 Node.js 运行时:

执行环境

执行环境包括运行时、操作系统、软件包和调用函数的库。

Node.js 18 及更高版本使用基于 Ubuntu 22.04 的执行环境。Node.js 18 之前的版本基于 Ubuntu 18.04。如需了解详情,请参阅 Cloud Run 函数执行环境

调用您的函数的库是 Node.js 版 Functions 框架

源代码结构

要让 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 函数

Node.js

// OK: await-ing a Promise before sending an HTTP response
await Promise.resolve();

// WRONG: HTTP functions should send an
// HTTP response instead of returning.
return Promise.resolve();

// HTTP functions should signal termination by returning an HTTP response.
// This should not be done until all background tasks are complete.
res.send(200);
res.end();

// WRONG: this may not execute since an
// HTTP response has already been sent.
return Promise.resolve();

使用中间件处理 HTTP 请求

Node.js HTTP Cloud Run functions 函数提供与 ExpressJS 兼容的 requestresponse 对象,以简化处理 HTTP 请求的过程。Cloud Run functions 函数会自动读取请求正文,因此不管媒体类型如何,您始终会收到请求正文。这意味着,在您的代码执行时,HTTP 请求应被视为已完全读取。嵌套 ExpressJS 应用时,应注意这条事项。具体而言,如果中间件预计请求正文未被读取,那么该中间件可能无法按预期运行。

使用 ES 模块

ECMAScript 模块(ES 模块或 ESM)是 Node.js 14+ 中用于加载 JavaScript 模块的 TC39 标准、未标记功能。与 CommonJS 不同,ESM 提供了一个用于加载模块的异步 API。它还通过可在 Cloud Run 函数中使用的 importexport 语句(而不是 require 语句)提供常见的语法改进。

如需在 Cloud Run 函数中使用 ESM,您必须在 package.json 中声明 "type": "module"

{
  ...
  "type": "module",
  ...
}

然后,您可以使用 importexport 语句。