React Native: Удалите изображение из firebase с помощью «refFromURL»

# #firebase #react-native #firebase-storage

Вопрос:

Я пытаюсь удалить изображение из firebase. Я думаю, что проблема в том, что я не получил URL-адрес. После обновления плоского списка я получаю следующее предупреждение:

«Возможное отклонение Необработанного Обещания (идентификатор: 1): Объект {}»

Это предупреждение отображается только при обновлении плоского списка после удаления элемента.

«downloadUrl» — это URL-адрес, который я загружаю, когда загружаю изображение в firebase. Это тот URL, который я должен попытаться получить, или я ошибаюсь?

 export function deleteBoards(item) {
  return (dispatch, getState) => {
    return new Promise((resolve, reject) => {
      firebase
        .firestore()
        .collection('coachboards')
        .doc(auth().currentUser.uid)
        .collection('userCoachboards')
        .doc(item.id)
        .delete()
        .then((snapshot) => {

          //Here I try to delete the image from firebase storage
          storage()
           .refFromURL(snapshot.data().downloadURL.url)
           .delete()
            .then(function () {
              resolve();
            })
            .catch(function (error) {console.log(error)});
        })
        .catch(() => {
          reject();
        });
    });
  };
}
 

Обновленный результат ✅

 export function deleteBoards(item) {
  return (dispatch, getState) => {
    return new Promise((resolve, reject) => {
      firebase
        .firestore()
        .collection('coachboards')
        .doc(auth().currentUser.uid)
        .collection('userCoachboards')
        .doc(item.id)
        .delete()
        .then(() => {
          //Here I try to delete the image from firebase storage
          storage()
            .refFromURL(item.downloadURL)
            .delete()
            .then(() => {
              resolve();
            })
            .catch(error => {
              reject();
            });
        })
        .catch(() => {
          reject();
        });
    });
  };
}
 

Ответ №1:

Как говорится в тексте ошибки, вы не обрабатываете случай ошибки, если delete произойдет сбой. Попробуйте добавить туда reject() :

 export function deleteBoards(item) {
  return (dispatch, getState) => {
    return new Promise((resolve, reject) => {
      firebase
        .firestore()
        .collection('coachboards')
        .doc(auth().currentUser.uid)
        .collection('userCoachboards')
        .doc(item.id)
        .delete()
        .then(() => {
          //Here I try to delete the image from firebase storage
          firebase.storage()
           .refFromURL(item.downloadURL)
           .delete()
            .then( () => {
              resolve();
            })
            .catch((error) => {
                reject()
            });
        })
        .catch(() => {
          reject();
        });
    });
  };
}
 

Можете ли вы также зарегистрировать это snapshot.data().downloadURL.url значение, чтобы убедиться, что оно правильное.

Также не должно ли это быть firebase.storage() вместо того, чтобы просто storage()

Комментарии:

1. Спасибо за ваш ответ! Мм, конечно, моя вина! но это все равно дает мне ту же ошибку/предупреждение. если я войду в журнал консоли console.log(item.downloadURL); вверху, он выдаст мне правильный URL-адрес, но если я попробую этот код .refFromURL(snapshot.data().item.downloadURL) , ничего не отобразится, я тоже попробовал .refFromURL(item.downloadURL) . и если я консольный журнал snapshot.data().downloadURL.url , ничего не отображается.

2. Вы можете сказать мне, что items это такое? У вас есть скриншот, как json , возможно, в базе данных. Если у вас получится downloadURL , item.downloadURL я бы рекомендовал использовать это напрямую, а не от snapshot . Я обновлю ответ

3. Теперь это работает, спасибо за помощь. Я обновил свой вопрос с рабочим результатом. Тем не менее, я изменил firebase.storage на просто storage (), и тогда это работает.

4. Ах, извините, что я изменил это, потому что я думал, что это тоже была ошибка. Приятно слышать, что это сработало 🙂