在本地运行函数

您可以在本地运行函数,以便在将其部署到生产环境中之前对其进行测试。要在本地运行函数,请从以下工具中选择一个:

  • Cloud Functions shell。此工具可模拟所有类型的函数触发器,并提供一个交互式 shell,以便您使用测试数据来调用函数。
  • Firebase CLI 的 firebase serve 命令。此工具可模拟 HTTPS 函数,并提供一个网址以用于触发本地函数。

无论您使用上述哪种工具,模拟器都会自动重新加载您在会话保持活动期间进行的代码更改。如果您的代码需要进行转译(TypeScript、React),请确保在运行模拟器之前执行此操作。

设置管理员凭据(可选)

如果您希望自己的函数测试通过 Firebase Admin SDK 与 Google API 或其他 Firebase API 进行交互,则可能需要设置管理员凭据。注意:

  • Cloud Firestore 和实时数据库触发器已经有足够的凭据,因而不需要额外的设置。
  • 所有其他 API(包括身份验证和 FCM 等 Firebase API,或 Cloud Translation 和 Cloud Speech 等 Google API)都需要执行本部分中介绍的设置步骤。无论您使用的是函数 shell 还是 firebase serve,都需要遵循此要求。

要为所模拟的函数(而非 Cloud Firestore 和实时数据库)设置管理员凭据,请执行以下操作:

  1. 打开 Google Cloud Console 中的服务帐号窗格
  2. 确保已选择 App Engine 默认服务帐号,并使用右侧的选项菜单选择创建密钥
  3. 出现提示时,选择 JSON 作为密钥类型,然后点击创建
  4. 将您的 Google 默认凭据设置为指向已下载的密钥:

    Unix

    $ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

    Windows

    $ set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

完成这些步骤之后,您的函数测试便可以使用 Admin SDK 访问 Firebase API 和 Google API。例如,在测试身份验证触发器时,模拟的函数可以调用 admin.auth().getUserByEmail(email)

为 HTTPS 函数使用 Firebase serve

要使用此功能,firebase-tools 必须为 3.8.0 版或更高版本,firebase-functions SDK 必须为 0.5.7 版或更高版本。要更新二者,请在项目的 functions/ 目录中运行以下命令:

npm install --save firebase-functions@latest firebase-admin
npm install -g firebase-tools

要在本地运行函数,请使用 firebase serve

firebase serve --only functions # to only emulate HTTP functions
firebase serve # to emulate both HTTP functions and hosting

此命令会为您的 Firebase 托管内容输出一个网址,并为每个 HTTPS 函数输出一个网址。如果您正使用函数动态生成用于 Firebase 托管的内容,那么这将使用您的本地函数作为托管代理。

使用 Cloud Functions shell

Cloud Functions shell 可通过交互式 shell 模拟所有类型的函数触发器,以使用测试数据调用函数。具体选项因函数类型而异,但基本使用格式为:

myFunctionName(data, options)

data 参数是实时数据库触发器和 PubSub 触发器所必需的,对于其他所有函数类型则为可选。此外,可选的 options 参数仅对实时数据库函数有效。

或者,您可以从本地文件加载测试数据,方法是将该文件保存为变量并使用它调用函数:

var data = require('./path/to/testData.json');
myFunction(data);

安装和配置 Cloud Functions shell

要使用此功能,firebase-tools 必须为 3.11.0 版或更高版本,firebase-functions SDK 必须为 0.6.2 版或更高版本。要更新二者,请在项目的 functions/ 目录中运行以下命令:

npm install --save firebase-functions@latest
npm install -g firebase-tools

如果您不使用自定义函数配置变量,请使用以下命令运行 shell:

firebase functions:shell

如果您要使用自定义函数配置变量,请先运行用来获取您的自定义配置的命令(在 functions 目录中运行),然后再运行 shell:

firebase functions:config:get > .runtimeconfig.json
firebase functions:shell

调用 HTTPS 函数

要在 shell 中调用 HTTPS 函数,用法与 request NPM 模块相同,但要将 request 替换为要模拟的函数的名称。例如:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

调用实时数据库函数

在本地运行实时数据库函数时,您需要提供合适的测试数据。这通常意味着为 onCreate 操作提供新的测试数据,为 onDelete 操作提供旧的/移除的数据,以及为 onUpdateonWrite 函数提供新的测试数据和旧的/移除的数据:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

除了 before/after 选项之外,shell 还提供 params 选项以用于模拟路径中的通配符:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

默认情况下,shell 以管理权限运行实时数据库函数。您可以使用 auth 选项,以特定最终用户或未经身份验证的用户的身份运行函数:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

调用 Firestore 函数

在本地运行 Firestore 函数时,您需要提供合适的测试数据。这通常意味着为 onCreate 操作提供新的测试数据,为 onDelete 操作提供旧的/移除的数据,以及为 onUpdateonWrite 函数提供新的测试数据和旧的/移除的数据。请注意,Firestore 数据必须是键值对;请参阅支持的数据类型

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

除了 before/after 选项之外,shell 还提供 params 选项以用于模拟文档名称中的通配符:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

shell 始终以管理权限运行 Firestore 函数,也就是说,它会模拟管理员用户执行的创建/更新/删除事件。

调用 PubSub 函数

对于 PubSub 函数,请在 Buffer 实例中插入您的消息负载,并有选择地添加数据属性,如下所示:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

调用 Analytics 函数

通过在 shell 中运行 myAnalyticsFunction(),您无需任何数据即可调用 Analytics 函数。要使用测试数据运行该函数,建议您为函数所需的特定事件数据字段定义一个变量:

var data = {
  eventDim: [{
    // populates event.data.params
    params:{foo:'bar'},
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

调用 Cloud Storage 函数、身份验证函数和 Crashlytics 函数

对于 Cloud Storage 函数、身份验证函数和 Crashlytics 函数,请使用您希望在函数中看到的测试数据来调用本地函数。您的测试数据必须符合相应的数据格式:

请仅指定您的代码依赖的字段;如果您只想运行该函数,则不要指定任何字段。

日志

firebase serve 和 Cloud Functions shell 这两个工具都会将您的函数所产生的日志流式传输到其运行所在的终端窗口。它们会显示您的函数中 console.log()console.info()console.error()console.warn() 语句的所有输出结果。

发送以下问题的反馈:

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