从云功能中删除云存储中的文件
Posted
技术标签:
【中文标题】从云功能中删除云存储中的文件【英文标题】:Delete file in cloud storage from cloud functions 【发布时间】:2018-11-13 16:52:25 【问题描述】:我正在尝试制作一个谷歌云函数,它删除链接到 Firebase 实时数据库中的人员对象的图像。但每次我收到“请求期间出错”错误(没有任何特定的 error.code,它只是未定义) )..这是一个函数代码:
const functions = require('firebase-functions');
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
const gcs = require('@google-cloud/storage')(
projectId: "PROJ_ID",
keyFilename: "SERV_ACC.json LOCATED IN FUNCTIONS FOLDER");
admin.initializeApp(functions.config().firebase);
exports.removePersonImage =
functions.database.ref("users/userId/persons/personId")
.onDelete((snapshot, context) =>
const person = snapshot.val();
if (!person.photo || !person.photo.key)
console.log("Person doesn't have photo");
return true;
var path = "user/" + context.params.userId + "/" + person.photo.key + ".jpg";
console.log("Bucket path: " + path);
return gcs.bucket(path)
.delete()
.then(() =>
console.log("Image " + person.photo.key + " successfully deleted");
return true;
)
.catch(err =>
console.error("Failed to remove image " + person.photo.key);
console.error("Error: " + err.message);
return false;
);
);
【问题讨论】:
【参考方案1】:我认为您正在使用文件的路径获取对 Bucket 的引用。
您应该首先创建对您的 Bucket 的引用,然后使用 Bucket 上的file()
方法来创建 File 对象。
首先从您在存储控制台中看到的根存储桶名称中声明存储桶,但没有gs://
,如下所示:
const bucket = gcs.bucket("***projectname***.appspot.com");
然后用“目录”声明你的文件。
const file = bucket.file("user/" + context.params.userId + "/" + person.photo.key + ".jpg");
然后调用delete:
return file.delete()
.then(() =>
....
见https://cloud.google.com/nodejs/docs/reference/storage/1.7.x/Bucket#file
和https://cloud.google.com/nodejs/docs/reference/storage/1.7.x/Storage#bucket
【讨论】:
使用该代码我得到 404 错误“没有这样的对象”.. 文件路径是正确的.. 看起来它正在尝试查找名称为 context.params.userId + "/" + person 的文件.photo.key + ".jpg".. 还尝试将 userId 移动到 bucket() 函数中的路径.. 但在请求错误期间出错。 @Anton 我已经更新了我的答案并成功测试了它。存储桶应为根存储桶名称,而不是“用户”。 是的......看起来我也发现了,5分钟前:)......无论如何,谢谢!我的错误是我使用***文件夹作为存储桶名称。我还删除了 gcs 并使用了 firebase.admin().storage() api。而且它在不配置任何额外服务帐户的情况下工作得很好。 实际上,您必须将.appspot.com
添加到存储桶名称的事实并没有很好的记录...如果您查看cloud.google.com/nodejs/docs/reference/storage/1.7.x/…,它显示了以下示例:const bucket = storage.bucket('albums'); const file = bucket.file('my-existing-file.png');
它给出了印象你应该使用你的***文件夹(子桶)....
为我工作,但我必须像这样导入和使用 GCS: import Storage from '@google-cloud/storage'; const gcs = new Storage();【参考方案2】:
const storage = new Storage(
credentials:
client_email: process.env.STORAGE_BUCKET_CLIENT_EMAIL,
private_key: process.env.STORAGE_BUCKET_PRIVATE_KEY,
,
projectId: process.env.STORAGE_BUCKET_PROJECT_ID,
);
bucket = storage.bucket(process.env.STROAGE_BUCKET_NAME);
const imageParts = user.thumbnail.split('/');\
bucket.file(`$imageParts[imageParts.length - 1]`)
.delete()
.then((res) => )
.catch((error) => );
【讨论】:
以上是关于从云功能中删除云存储中的文件的主要内容,如果未能解决你的问题,请参考以下文章