firebase 云功能更新:无法读取未定义的属性“forEach”

dsf9zpds  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(112)

现在我正在尝试更新我的项目中的图片。我可以更新云火商店里的图片网址。但我也想删除之前的图片从云存储使用firebase云函数。
我想要实现的是,在上传新图片时,从云存储中删除以前的图片。
这是我的数据结构。

的数据
我在“产品”集合中有“样品”字段。当“sample”字段中的图片更新时,我想删除云存储中的原始图片。
但是我在云功能日志控制台中得到了一个错误。
TypeError:无法读取未定义的属性“forEach”



这是我的云函数代码。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

const Firestore = admin.firestore;
const db = Firestore();


exports.onProductUpdate = functions.firestore.document('Product/{productId}').onUpdate(async(snap, context) => {
    const deletePost = snap.before.data().sample;

    let deletePromises = [];
    const bucket = admin.storage().bucket();

    deletePost.images.forEach(image => {
        deletePromises.push(bucket.file(image).delete())
    });
    
    await Promise.all(deletePromises)
})

字符串
我想修复这个错误。

ssm49v7z

ssm49v7z1#

onUpdate只查看一个文档,从您的文档截图中可以看出,snap.before.data().sample是一个字符串,您的代码将其视为对象,甚至是查询快照?
除非我误解了,这是正确的代码吗?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

const Firestore = admin.firestore;
const db = Firestore();


exports.onProductUpdate = functions.firestore.document('Product/{productId}').onUpdate(async(snap, context) => {
    const deletePost = snap.before.data().sample;
    const bucket = admin.storage().bucket();

    await bucket.file(deletePost).delete();

    return null;   // See https://firebase.google.com/docs/functions/terminate-functions
 
});

字符串

wz3gfoph

wz3gfoph2#

独立于forEach问题,您的代码无法工作:你尝试向一个Bucket的file()方法传递一个URL,而你应该传递这个Bucket中的文件名。
一种解决方案是在Product文档的另一个字段中保存文件名。
然后,正如Cleanbeans解释的那样,您不需要使用forEach,因为在您的Cloud Function中,您只处理一个Firestore文档。
只需使用包含文件名的另一个字段并调整Cleanbeans的解决方案,如下所示:

exports.onProductUpdate = functions.firestore.document('Product/{productId}').onUpdate(async(snap, context) => {
    const deleteFileName = snap.before.data().fileName;
    const bucket = admin.storage().bucket();

    await bucket.file(deleteFileName).delete())

    return null;   // Don't forget to return null for example (or an Object or a Promise), to indicate to the platform that the CF can be cleaned up. See https://firebase.google.com/docs/functions/terminate-functions

});

字符串

相关问题