我正在启动一个云功能,以便复制我在Firestore中的一个寄存器。其中一个字段是图像,函数首先尝试复制图像,然后复制寄存器。
这是代码:
export async function copyContentFunction(data: any, context: any): Promise<String> {
if (!context.auth || !context.auth.token.isAdmin) {
throw new functions.https.HttpsError('unauthenticated', 'Auth error.');
}
const id = data.id;
const originalImage = data.originalImage;
const copy = data.copy;
if (id === null || originalImage === null || copy === null) {
throw new functions.https.HttpsError('invalid-argument', 'Missing mandatory parameters.');
}
console.log(`id: ${id}, original image: ${originalImage}`);
try {
// Copy the image
await admin.storage().bucket('content').file(originalImage).copy(
admin.storage().bucket('content').file(id)
);
// Create new content
const ref = admin.firestore().collection('content').doc(id);
await ref.set(copy);
return 'ok';
} catch {
throw new functions.https.HttpsError('internal', 'Internal error.');
}
}
我已经尝试了多种组合,但这个代码总是失败。由于某种原因,复制图像的过程失败,我做错了什么?
谢谢。
在Cloud Function中使用copy()
方法应该没有问题。你没有分享任何关于你得到的错误的细节(我建议使用catch(error)
而不仅仅是catch
),但我可以看到你的代码有两个潜在的问题:
originalImage
对应的文件不存在;content
bucket在云存储实例中不存在
第二个问题通常来自混淆bucket概念的常见错误和文件夹(或目录)
实际上谷歌云存储没有真正的"文件夹"。在Cloud Storage控制台中,存储桶中的文件以文件夹的分层树形式呈现(就像本地硬盘上的文件系统一样),但这只是呈现文件的一种方式:存储桶中没有真正的文件夹/目录。Cloud Storage控制台只是使用文件路径的不同部分来"模拟"。一个文件夹结构,使用"/"分隔符字符。
这个关于云存储和gsutil
的文档很好地解释和说明了这种"分层文件树的错觉"。
因此,如果您想将文件从默认存储桶复制到内容文件夹,请执行以下操作:
await admin.storage().bucket().file(`content/${originalImage}`).copy(
admin.storage().bucket().file(`content/${id}`)
);