【问题标题】:How can I deploy a Firebase Function that runs if a file is uploaded to Firebase Storage?如果将文件上传到 Firebase 存储,如何部署运行的 Firebase 函数?
【发布时间】:2018-07-12 21:45:35
【问题描述】:

我正在尝试部署一个 Firebase 函数,该函数在将图像上传到名为“upload”的存储桶时运行。但是,当我尝试部署该功能时,出现此错误:

未能配置触发 GCS 存储桶:上传

以下是一些附加信息:

我的存储桶是:gs://my-firestore-c379d.appspot.com/upload

以下是代码示例:

'use strict';

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();

functions.storage.bucket('upload').object().onChange(event => {

exports.photoInfo = functions.storage.object().onChange(event => {
const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
const metadata = object.metadata;
const guestId = object.metadata['guestId'];

console.log('object:' + object);
console.log('fileBucket: ' + fileBucket);
console.log('filePath: ' + filePath);
console.log('contentType: ' + contentType);
console.log('resourceState: ' + resourceState);
console.log('metageneration: ' + metageneration);
console.log('metadata: ' + metadata);
console.log('guestId: ' + guestId);

return 0;

});

这是我的 package.json:

{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
  "lint": "./node_modules/.bin/eslint .",
  "serve": "firebase serve --only functions",
  "shell": "firebase experimental:functions:shell",
  "start": "npm run shell",
  "deploy": "firebase deploy --only functions",
  "logs": "firebase functions:log"
 },
"dependencies": {
  "firebase-admin": "~5.8.1",
  "firebase-functions": "^0.8.1",
  "@google-cloud/storage": "^1.5.2"
},
"devDependencies": {
  "eslint": "^4.12.0",
  "eslint-plugin-promise": "^3.6.0"
},
"private": true
}

我做了一些研究并找到了这两个链接,但我仍然无法删除该错误:

https://github.com/firebase/functions-samples/issues/66

https://github.com/firebase/friendlychat-web/issues/184#issuecomment-290914672

如何创建一个仅侦听“上传”存储桶中所做更改并消除该错误的函数?

感谢您的帮助。

【问题讨论】:

    标签: javascript firebase firebase-storage google-cloud-functions


    【解决方案1】:

    这似乎是一个语法错误:

    functions.storage.bucket('upload').object().onChange(event => {
    
    exports.photoInfo = functions.storage.object().onChange(event => {
    

    如果您查看documentation for triggering Cloud Functions from Storage,它会说:

    使用functions.storage 创建一个处理云存储事件的函数。根据您是要将函数的范围限定为特定的 Cloud Storage 存储分区还是使用默认存储分区,使用以下任一方法(强调我的):

    • functions.storage.object() 监听默认存储桶上的对象变化。
    • functions.storage.bucket('bucketName').object() 监听特定存储桶上的对象变化。
    exports.generateThumbnail = functions.storage.object().onChange(event => {
      // ...
    });
    

    这意味着您不应在一个函数中同时使用两种签名,而应选择符合您需要的一个。由于您尝试在特定存储桶上触发:

    functions.storage.bucket('upload').object().onChange(event => {
      // ...
    })
    

    【讨论】:

    • 感谢您的帮助,弗兰克。我有点困惑。现在我明白监听器是针对整个存储桶的。不可能只为存储桶中的特定文件夹设置侦听器。
    【解决方案2】:

    ...这两个嵌套的导出也看起来很奇怪,不知何故。

    FireStore 也会有一个OnCreate 事件触发器...Cloud Storage Triggers 的示例也没有显示任何嵌套的导出/嵌套的可安装触发器。也许在exports.generateThumbnail 中记录存储桶名称?

    bucket ACL 也可以阻止安装触发器。

    【讨论】:

    • 嗨,马丁,感谢您的评论。 Frank 的回复帮助我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2016-11-05
    • 1970-01-01
    • 2018-06-21
    • 2019-02-10
    • 2020-05-07
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多