管理函数部署和运行时选项

您可以通过使用 Firebase CLI 命令或通过在函数源代码中设置运行时选项来部署、删除和修改函数。

部署函数

要部署函数,请运行此 Firebase CLI 命令:

$ firebase deploy --only functions

默认情况下,Firebase CLI 会同时部署 index.js 中的所有函数。如果您的项目包含 5 个以上的函数,我们建议您使用 --only 标志并指定函数名称,以便仅部署您已修改的函数。以这种方式部署特定函数可加快部署流程,并可帮助您避免达到部署配额。例如:

$ firebase deploy --only functions:addMessage,functions:makeUppercase

要查看可用命令的完整列表,请参阅 Firebase CLI 参考

默认情况下,Firebase CLI 会在 functions/ 文件夹中查找源代码。您可以指定其他文件夹,只需在 firebase.json 中添加以下行即可:

"functions": {
  "source": "another-folder"
}

删除函数

您可以通过以下两种方式删除以前部署的函数:

  • 在 Firebase CLI 中使用 functions:delete(显式删除法)
  • 在部署前从 index.js 中移除函数(隐式删除法)

两种操作都会提示您确认是否从生产环境中移除函数。

Firebase CLI 中的显式函数删除法支持多个参数以及函数组,并允许您指定在特定区域中运行的函数。此外,您还可以覆盖确认提示。

# Delete all functions that match the specified name in all regions.
$ firebase functions:delete myFunction

# Delete a specified function running in a specific region.
$ firebase functions:delete myFunction --region us-east-1

# Delete more than one function
$ firebase functions:delete myFunction myOtherFunction

# Delete a specified functions group.
$ firebase functions:delete groupA

# Bypass the confirmation prompt.
$ firebase functions:delete myFunction --force

在隐式函数删除法中,firebase deploy 会解析 index.js,并会从生产环境中移除已从该文件中移除的所有函数。请注意,在非交互模式下进行部署时,将无法删除函数。

修改函数的名称、区域或触发器

如要更改正在处理生产流量的函数的名称、区域或触发器,请按本部分中的步骤操作,以避免在修改期间丢失事件。在执行这些步骤之前,请先确保您的函数为幂等函数,因为在更改期间,函数的新版本和旧版本均会处于运行状态。

重命名函数

要重命名函数,请在 index.js 中创建函数改名后的新版本,然后分别运行两个部署命令。第一个命令部署改名后的函数,而第二个命令则移除以前部署的版本。例如,如果您要将名为 webhook 的函数更名为 webhookNew,请按以下方式修改代码:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

然后运行以下命令,以部署新函数:

# Deploy new function called webhookNew
$ firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
$ firebase functions:delete webhook

更改函数的区域

要更改正在处理生产流量的函数的区域,您可以按顺序执行以下步骤,以防止丢失事件:

  1. 重命名该函数,并更改其区域。
  2. 部署重命名的函数,以便临时性地在两个区域中运行相同的代码。
  3. 删除先前的函数。

例如,如果有一个名为 webhook 的函数目前正在默认函数区域 us-central1 中运行,而您希望将该函数迁移到 asia-northeast1,那么您首先应该修改源代码,以重命名该函数并修改区域。

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

然后通过运行以下命令进行部署:

$ firebase deploy --only functions:webhookAsia

现在,有两个运行的函数完全相同:webhook 正在 us-central1 中运行,webhookAsia 正在 asia-northeast1 中运行。

然后,删除 webhook

$ firebase functions:delete webhook

现在,只有 webhookAsia 这一个函数,它正在 asia-northeast1 中运行。

更改函数的触发器类型

随着您逐步开展 Cloud Functions for Firebase 部署工作,可能会出于各种原因而需要更改某函数的触发器类型。例如,您可能希望:

  • 将旧版存储 onChange 事件更改为 onFinalizeonDeleteonArchiveonMetadataUpdate。(如需了解这方面的详情,请参阅测试版到 v1 或 v2 升级指南)。
  • 更改 Firebase 实时数据库或 Cloud Firestore 事件的类型,例如,将宽泛的 onWrite 事件更改为细化的 onCreate 事件。

仅凭更改源代码和运行 firebase deploy 无法更改函数的事件类型。为避免错误,请按以下程序更改函数的触发器类型:

  1. 修改源代码,以加入具备所需触发器类型的新函数。
  2. 部署该函数,以便临时性地同时运行旧函数和新函数。
  3. 利用 Firebase CLI 从生产环境中以显式方法删除旧函数。

例如,如果函数 objectChanged 具有旧版 onChange 事件类型,而您要将其更改为 onFinalize,那么您首先需要重命名该函数,然后对其进行修改,使其采用 onFinalize 事件类型。

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

然后运行以下命令,以便先创建新函数,然后再删除旧函数:

# Create new function objectFinalized
$ firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
$ firebase functions:delete objectChanged

设置运行时选项

借助 Cloud Functions for Firebase,您可以选择运行时选项,例如 Node.js 运行时版本、函数的专属超时和内存分配设置。

设置 Node.js 版本

Firebase SDK for Cloud Functions 2.0.0 及更高版本支持一系列 Node.js 运行时。您可以选择仅在 Node.js 版本 6 或版本 8 上运行一个项目中的所有函数。请注意,Node.js 8 运行时目前处于测试阶段,您需要使用 firebase-tools 4.0.0 或更高版本才能向 Node.js 8 部署函数。

设置版本的具体方法是:向初始化期间在 functions/ 目录中创建的 package.json 文件添加 engines 字段。例如,如果您希望仅使用版本 8,则可以修改 package.json,以添加以下行:

  "engines": {"node": "8"}

或者,您可以完全省略 engines 字段,这样即可为所有函数使用 Node.js 6(默认值)。

设置超时和内存分配

在某些情况下,您的函数可能有特殊要求,需要具备较长的超时值或分配较多的内存。您可以在 Google Cloud Console 或函数源代码(仅限 Firebase)中设置这些值。

要在函数源代码中设置内存分配和超时,请使用 Firebase SDK for Cloud Functions 2.0.0 中引入的 runWith 参数。该运行时选项接受符合 RuntimeOptions 接口的 JSON 对象(定义 timeoutSecondsmemory 的值)。例如,以下存储函数使用 1GB 的内存,并会在 300 秒后超时:

const runtimeOpts = {
  timeoutSeconds: 300,
  memory: '1GB'
}

exports.myStorageFunction = functions
  .runWith(runtimeOpts)
  .storage
  .object()
  .onFinalize((object) = > {
    // do some complicated things that take a lot of memory and time
  });

timeoutSeconds 的最大值为 540,即 9 分钟。memory 的有效值为:

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

要在 Google Cloud Platform Console 中设置内存分配和超时,请执行以下操作:

  1. 在 Google Cloud Platform Console 中,从左侧菜单中选择 Cloud Functions
  2. 点击函数列表中的名称,选择相应函数。
  3. 点击顶部菜单中的修改图标。
  4. 从名为分配的内存的下拉菜单中选择内存分配。
  5. 点击更多以显示高级选项,并在超时文本框中输入秒数。
  6. 点击保存以更新函数。

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面