使用firebase函数读取firebase存储并写入firestore



我尝试过这个类型脚本代码

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import serviceAccount from "/Users/300041370/Downloads/serviceKey.json";
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
const buckObj = functions.storage.bucket("myBucket").object();
export const onWikiWrite = buckObj.onFinalize(async (object) => {
const filePath = object.name ?? "test.json";
const bucket = admin.storage().bucket("myBucket");
bucket.file(filePath).download().then((data) => {
const contents = data[0];
data = {"key": "value"};
const doc = admin.firestore().collection("myCollection").doc();
doc.set(data);
});
});

但这给了我以下错误

"状态":{"代码":7,"消息":"权限不足,无法(重新)配置触发器(bucket myBucket的权限被拒绝)。请将所有者权限授予bucket的编辑器角色,然后重试。

我在这里问过这个问题,但它作为这个问题的副本被关闭了。它基本上说,storage.bucket("myBucket")功能不受支持,我将不得不使用match将此操作限制在该特定bucket/文件夹中的文件。因此,我尝试了这个

const buckObj = functions.storage.object();
export const onWikiWrite = buckObj.onFinalize(async (object) => {
if (object.name.match(/myBucket//)) {
const fileBucket = object.bucket;
const filePath = object.name;
const bucket = admin.storage().bucket(fileBucket);
bucket.file(filePath).download().then((data) => {
const contents = data[0];
const doc = admin.firestore().collection("myCollection").doc();
const data = {content: contents}
doc.set(data);
});
}
});

我仍然面临着同样的问题。我在这里重复一遍:

"状态":{"代码":7,"消息":"权限不足,无法(重新)配置触发器(bucket myBucket的权限被拒绝)。请将所有者权限授予bucket的编辑器角色,然后重试。

由于Firebase SDK for Cloud Functions的版本为1.0,firebase-admin应在Cloud Functions运行时内进行初始化,无需任何参数。

以下内容应该有效(我已经删除了对filePath的检查):

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
export const onWikiWrite = functions.storage
.object()
.onFinalize(async (object) => {
const fileBucket = object.bucket;
const filePath = object.name;
const bucket = admin.storage().bucket(fileBucket);
return bucket
.file(filePath)
.download()
.then((data) => {
const contents = data[0];
return admin
.firestore()
.collection('myCollection')
.add({ content: contents });
});
});

请注意,我们返回异步Firebase方法返回的承诺链。在执行异步处理(也称为"后台函数")的云函数中,关键是在所有异步处理完成时返回JavaScript承诺。

我们也使用add()方法来代替doc().set()


最后,在检查filePath的值时,要注意云存储中实际上没有文件夹或子目录的概念(请参阅此答案)。

最新更新