Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 云函数onUpdate:无法读取属性';forEach&x27;未定义的_Javascript_Node.js_Firebase_Google Cloud Functions_Google Cloud Storage - Fatal编程技术网

Javascript 云函数onUpdate:无法读取属性';forEach&x27;未定义的

Javascript 云函数onUpdate:无法读取属性';forEach&x27;未定义的,javascript,node.js,firebase,google-cloud-functions,google-cloud-storage,Javascript,Node.js,Firebase,Google Cloud Functions,Google Cloud Storage,现在我正在尝试更新我的项目中的图片。 我可以在CloudFire商店中更新图片url。 但我也想使用firebase云函数从云存储中删除上一张图片 我想要实现的是,当我上传新图片时,从云存储中删除以前的图片 这是我的数据结构。 我在“产品”集合中有“样本”字段。当“示例”字段中的图片更新时,我想删除云存储中的原始图片 但我在云函数日志控制台中出错 TypeError:无法读取未定义的属性“forEach” 这是我的云函数代码 const functions = require('fireba

现在我正在尝试更新我的项目中的图片。 我可以在CloudFire商店中更新图片url。 但我也想使用firebase云函数从云存储中删除上一张图片

我想要实现的是,当我上传新图片时,从云存储中删除以前的图片

这是我的数据结构。

我在“产品”集合中有“样本”字段。当“示例”字段中的图片更新时,我想删除云存储中的原始图片

但我在云函数日志控制台中出错

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)
})

我想修复此错误。

onUpdate只查看一个文档,从文档的屏幕截图中会显示
snap.before.data()。示例是一个字符串,代码将其视为对象,甚至是查询快照

除非我误解了,否则这是正确的代码吗

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
 
});

forEach
问题无关,您的代码无法工作:您尝试将URL传递给Bucket的方法,而您应该传递此Bucket中的文件名

一种解决方案是在
产品
文档的另一个字段中保存文件名

然后,正如Cleanbeans所解释的,您不需要使用
forEach
,因为在您的云函数中,您只处理一个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

});

这意味着
deletePost.images
未定义-console.log(deletePost.images)
输出是什么?@Renaud感谢您的回复。谢谢您的回答,我可以解决这个问题。