【问题标题】:Cloud functions onUpdate: Cannot read property 'forEach' of undefined云函数 onUpdate:无法读取未定义的属性“forEach”
【发布时间】:2021-02-27 16:48:12
【问题描述】:

现在我正在尝试更新我的项目中的图片。 我可以更新云火商店中的图片网址。 但我也想使用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)
})

我想修正这个错误。

【问题讨论】:

  • 这意味着 deletePost.images 未定义 - console.log(deletePost.images) 输出什么?

标签: javascript node.js firebase google-cloud-functions google-cloud-storage


【解决方案1】:

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

【讨论】:

  • @Renaud 感谢您的回报。
【解决方案2】:

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

一种解决方案是在Product doc 的另一个字段中保存文件名。

然后,正如 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

});

【讨论】:

  • 谢谢你的回答,我云解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多