【问题标题】:How to test firebase triggers locally for storage?如何在本地测试 Firebase 触发器以进行存储?
【发布时间】:2018-04-16 05:49:21
【问题描述】:

我有一个以这样的触发器开始的函数:

exports.generateThumbnail = functions.storage.object().onChange(event => {

如何在本地进行测试?我已经阅读了 Firebase 的本地测试文档,但是有人可以给我一个如何在本地触发它的示例,目前这有点令人困惑。谢谢!

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    要在本地测试 Firebase Cloud Functions,您有两种选择:

    • 云函数外壳
    • Firebase CLI

    后者仅适用于 HTTPS 函数,因此它实际上与您的目的无关(您正在测试存储触发函数)。

    让我们从项目的functions 目录调用 Cloud Functions Shell:

    $ npm i -g firebase-tools@latest
    ...
    
    $ firebase --version
    3.17.3
    
    $ firebase experimental:functions:shell
    i  functions: Preparing to emulate functions.
    ✔  functions: generateThumbnail
    firebase >
    

    这为您提供了一个交互式外壳,您可以在其中直接执行您的函数:

    firebase > generateThumbnail()
    'Successfully invoked function.'
    ...
    

    或者任何其他 JavaScript 代码:

    firebase > console.log(Math.random())
    0.17387339404246105
    undefined
    

    在本地测试函数时,您不会收到真正的 Firebase 存储事件,因此,您必须使用测试数据调用函数。

    来自official documentation

    对于 Storage、Auth 和 Crashlytics 函数,调用本地 使用您希望在 功能。您的测试数据必须遵循相应的数据格式:

    • 对于云存储:ObjectMetadata
    • 用于身份验证:用户记录
    • 对于 Crashlytics:问题

    仅指定您的代码所依赖的字段,如果您只想运行该函数,则根本不指定。

    好的,接下来你需要创建一些符合ObjectMetadata的测试数据

    在项目的functions 目录中创建一个包含以下内容的文件testData.json。注意对应的ObjectMetadata 字段:

    {
      "bucket": "unique-name-of-your-app.appspot.com",
      "contentDisposition": "inline; filename*=utf-8''test.png",
      "contentType": "image/png",
      "crc32c": "LaOnCg==",
      "etag": "CeDut9jz5dgCFAE=",
      "generation": "1416567827822212",
      "id": "unique-name-of-your-app.appspot.com/test.png/1416567827822212",
      "kind": "storage#object",
      "md5Hash": "N2rxNWE0ZGRtZmE0Y2M2NDIyOWY5NzIeNzA4YzdizjU=",
      "mediaLink": "https: //www.googleapis.com/download/storage/v1/b/unique-name-of-your-app.appspot.com/o/test.png?generation=1416567827822212&alt=media",
      "metadata": {
        "firebaseStorageDownloadTokens": "1cbc7278-9e5b-4d05-a5de-91a3a067a4bc"
      },
      "metageneration": "1",
      "name": "test.png",
      "resourceState": "not_exists",
      "selfLink": "https: //www.googleapis.com/storage/v1/b/unique-name-of-your-app.appspot.com/o/test.png",
      "size": "168501",
      "storageClass": "STANDARD",
      "timeCreated": "2018-01-21T20: 33: 47.739Z",
      "timeDeleted": "2018-01-21T20: 33: 58.207Z",
      "timeStorageClassUpdated": "2018-01-21T20: 33: 47.739Z",
      "updated": "2018-01-21T20: 33: 47.739Z"
    }
    

    正如文档所述,您不一定需要所有这些字段,请使用您的测试实际需要的字段。

    现在您可以返回 Cloud Functions Shell 并导入测试数据:

    firebase > const testData = require('./testData.json')
    undefined
    

    并以测试数据作为参数调用您的函数:

    firebase > generateThumbnail(testData)
    'Successfully invoked function.'
    ...
    

    为了进一步自动化,您还可以创建一个testFunction.js 文件,其内容如下:

    const testData = require('./testData.json');
    generateThumbnail(testData);
    

    现在,您无需在 Cloud Functions Shell 中手动输入所有这些内容,只需从操作系统的 shell 执行它并通过标准输入重定向 testFunction.js

    $ firebase experimental:functions:shell < ./testFunction.js 
    i  functions: Preparing to emulate functions.
    ✔  functions: generateThumbnail
    firebase > const testData = require('./testData.json');
    undefined
    firebase > generateThumbnail(testData);
    'Successfully invoked function.'
    ...
    

    希望这会有所帮助。

    【讨论】:

    • 是否有任何地方可以下载对象的元数据以将其转换为 json 格式?在谷歌云平台上,“编辑元数据”只提供了几个字段。
    • 想通了...如果有更好的解决方案,请告诉我(我真的希望有)。我在函数中添加了一行“console.log(object);”打印所需的 json,将其部署到云端,触发它并查看日志。
    猜你喜欢
    • 2018-03-18
    • 2018-10-21
    • 2021-06-11
    • 2019-10-05
    • 1970-01-01
    • 2021-05-18
    • 2015-10-06
    • 2019-06-14
    • 2011-03-11
    相关资源
    最近更新 更多