将 Cloud Functions 函数迁移到较新版本的 Node.js 运行时

本文档介绍了 Node.js 运行时各版本之间的差异,以帮助您迁移 Cloud Functions 函数代码。

迁移到较新的运行时

如需迁移到较新的运行时,请执行以下操作:

  1. 阅读本文档中关于目标运行时的内容,了解其引入的差异,并对代码进行任何必要的更改。特别是要注意 Node.js 10 运行时中引入的环境变量更改
  2. 部署函数,指定目标 Node.js 运行时

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Node.js 14 运行时的差异

Node.js 14 引入了一些新功能和概念。亮点:

  • 可选链式调用。可选链式调用如下所示:{"hello": null}?.hello?.neat。它允许安全访问针对可能不存在的对象的深度密钥。
  • 空值合并。这会引入 ??,比使用 || 进行分配更安全(因为对于 nullundefined,计算结果仅为 false)。

如需详细了解 Node.js 14 功能,请点击此处

Node.js 12 运行时的差异

Node.js 12 使用 npm ci,它始终在 package.json 中运行 prepare 脚本。

使用 npm installnpm ci 的主要区别如下:

  • 项目必须已具有 package-lock.jsonnpm-shrinkwrap.json
  • 如果软件包锁定中的依赖项与 package.json 中的依赖项不匹配,则 npm ci 将退出,而不更新软件包锁定。
  • 如果 node_modules 已存在,则它将在 npm ci 开始其安装之前被自动移除。

如需从 Node.js 10 升级到 Node.js 12,请将 prepare 中使用的依赖项从 devDependencies 移到 dependencies

对于 Node.js 12 及更高版本,内存限制大于 2GiB 的函数要求用户将 NODE_OPTIONS 配置为具有 max_old_space_size。例如:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Node.js 10 运行时的差异

由于 Node.js 10 运行时发生了一些变化,因此您可能需要修改函数的源代码才能使用较新版本的运行时。

对于大多数应用,从 Node 8 升级至 Node 10 时无需更改代码(主要区别是 GCF 上的环境变量发生了变化)。

Node 10 引入了各种令人振奋的新功能,例如异步迭代器和基于 Promise 的文件 API,以及性能提升和安全补丁程序。

日志记录

如果您在 Node.js 8 中记录对象和/或集合时未使用 JSON.stringify,则在升级到 Node.js 10 时,您可能会看到的日志量有所增加。这可能会产生额外费用。我们建议您使用 JSON.stringify 将日志语句组合在一起,如写入、查看和响应日志中所示。

环境变量更改

由 Node.js 10 运行时预定义的环境变量也发生了变化。如需详细了解 Node.js 10 运行时与过往运行时设置的环境变量之间的区别,请参阅自动设置的环境变量

如需在 Node.js 10 运行时(及更高版本)中运行旧版 Node.js 函数,您可能需要更改当前使用的预定义环境变量。请更新代码,以尽可能使用替换变量或在部署函数时自行设置这些变量。我们建议的最佳做法是,不要依赖尚未显式设置的环境变量。

Node.js 10 运行时不再设置以下环境变量:

环境变量 迁移
CODE_LOCATION 部署函数时设置该变量。您的代码位置为 /srv
ENTRY_POINT 改用 FUNCTION_TARGET 环境变量。
GOOGLE_CLOUD_PROJECT 部署函数时设置该变量。
GCP_PROJECT 部署函数时设置该变量。
GCLOUD_PROJECT 部署函数时设置该变量。
GOOGLE_CLOUD_REGION 部署函数时设置该变量。
FUNCTION_REGION 部署函数时设置该变量。
FUNCTION_NAME 改用 K_SERVICE 环境变量。
FUNCTION_IDENTITY 部署函数时设置该变量。
FUNCTION_MEMORY_MB 部署函数时设置该变量。
FUNCTION_TIMEOUT_SEC 部署函数时设置该变量。
FUNCTION_TRIGGER_TYPE 请改用 FUNCTION_SIGNATURE_TYPE 环境变量。如需了解详细用法,请参阅使用环境变量
OLDPWD 不再可用。
SHLVL 不再可用。

Node.js 8 运行时的差异

后台函数的签名在 Node.js 6 和 Node.js 8 运行时之间发生了变化,而且一直持续到 Node.js 10 中。

以下是一个 Node.js 6 后台函数示例:

exports.nodejs6BackgroundFunction = (event, callback) => {
  let data = event.data;
  let context = event.context;
  // ... the rest of your function
};

请注意,event 参数包含 datacontext 属性。在 Node.js 10 运行时中,datacontext 属性已从 event 对象中提取出来,现在包含在函数签名中:

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

这项更改简化了对以前包含在 event 参数中的 datacontext 对象的引用。如需了解详情,请参阅后台函数参数

如果您使用的是 Node.js 6 后台函数签名,请进行以下更改以在较新的 Node.js 运行时中运行您的函数:

  1. 将函数签名从 (event, callback) 更改为 (data, context, callback)

  2. 将对 event.dataevent.context 的引用分别更改为 datacontext

弃用:Node.js 6 和 Node.js 8

Node.js 6Node.js 8 运行时已被弃用。为了确保您的函数使用的是受支持的 Node.js 版本,请将其迁移至 Node.js 10 或更高版本

2020 年 8 月 5 日之后,系统将不再支持使用 Node.js 6 部署函数。在此之后,仍在使用 Node.js 6 的 Cloud Functions 函数可能会被停用。