将 Cloud Functions 函数迁移到较新版本的 Node.js 运行时
本文档介绍了 Node.js 运行时各版本之间的差异,以帮助您迁移 Cloud Functions 函数代码。
迁移到较新的运行时
如需迁移到较新的运行时,请执行以下操作:
- 阅读本文档中关于目标运行时的内容,了解其引入的差异,并对代码进行任何必要的更改。特别是要注意 Node.js 10 运行时中引入的环境变量更改。
部署函数,指定目标 Node.js 运行时:
gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...
Node.js 14 运行时的差异
Node.js 14 引入了一些新功能和概念。亮点:
- 可选链式调用。可选链式调用如下所示:
{"hello": null}?.hello?.neat
。它允许安全访问针对可能不存在的对象的深度密钥。 - 空值合并。这会引入
??
,比使用||
进行分配更安全(因为对于null
或undefined
,计算结果仅为false
)。
如需详细了解 Node.js 14 功能,请点击此处。
Node.js 12 运行时的差异
Node.js 12 使用 npm ci
,它始终在 package.json
中运行 prepare
脚本。
使用 npm install
和 npm ci
的主要区别如下:
- 项目必须已具有
package-lock.json
或npm-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
参数包含 data
和 context
属性。在 Node.js 10 运行时中,data
和 context
属性已从 event
对象中提取出来,现在包含在函数签名中:
exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
// ... the rest of your function is unchanged
};
这项更改简化了对以前包含在 event
参数中的 data
和 context
对象的引用。如需了解详情,请参阅后台函数参数。
如果您使用的是 Node.js 6 后台函数签名,请进行以下更改以在较新的 Node.js 运行时中运行您的函数:
将函数签名从
(event, callback)
更改为(data, context, callback)
。将对
event.data
和event.context
的引用分别更改为data
和context
。
弃用:Node.js 6 和 Node.js 8
Node.js 6 和 Node.js 8 运行时已被弃用。为了确保您的函数使用的是受支持的 Node.js 版本,请将其迁移至 Node.js 10 或更高版本。
2020 年 8 月 5 日之后,系统将不再支持使用 Node.js 6 部署函数。在此之后,仍在使用 Node.js 6 的 Cloud Functions 函数可能会被停用。