Now I am trying to update the picture in my project. I could update the picture url in the cloud fire store. But also I want to delete the previous picture from the cloud storag
Independently of the forEach
problem, your code cannot work: you try to pass an URL to the file() method of a Bucket, while you should pass the name of the file in this bucket.
One solution would be to save, in another field of the Product
doc, the name of the file.
Then, as Cleanbeans explained, you don't need to use forEach
, since in your Cloud Function, you are treating only one Firestore document.
Just use the other field containing the file name and adapt Cleanbeans' solution as follows:
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
});
onUpdate is only looking at one document and it would appear from your screenshot of your doc that snap.before.data().sample
is a string where your code is treating it like an object, or even a query snapshot?
Unless I've misunderstood, does this is correct your code?
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
});