Хранилище Firebase тихо выходит из строя?

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

Вот код:

const promises = [];

snapshot.forEach(childSnapshot => {
  const child = childSnapshot.val();
  const promise = firebase.storage()
    .ref(child.songImagePath)
    .getDownloadURL()
    .catch(err => {
      console.log('caught', err);
      return "";
    })
    .then(imageURL => {
      return imageURL;
    });

  promises.push(promise);
});

Promise.all(promises)
  .catch(err => {
    console.log('caught', err);
  })
  .then(urls => {
    ...do something with urls array
  });

Я использую child.songImagePath в своей базе данных для хранения местоположения изображения в хранилище. Если ВСЕ пути для ВСЕХ изображений имеют изображения, все работает отлично.

НО, если загрузка пошла не так или по какой-то причине в месте хранения нет изображения, она автоматически завершается ошибкой. Ни один из моих catches не загорелся. И Promise.all никогда не разрешается.

Что тут происходит? Есть ли способ проверить существование файла перед вызовом getDownloadURL?

РЕДАКТИРОВАТЬ: Как указывает @mjr, в документации они отформатировали свой обратный вызов ошибки немного иначе, чем я. Это также, похоже, никогда не вызывает ошибку:

.then(
    imageURL => {
        return imageURL;
    },
    err => {
        console.log('caught', err);
        return "";
    }
);

person nicholas    schedule 16.09.2016    source источник
comment
Документы имеют другой способ форматирования отлова ошибок, чем вы сделал это здесь. я бы попробовал так и посмотрю что получится   -  person mjr    schedule 16.09.2016
comment
Я заметил, что. Кажется, также не вызывает обратный вызов ошибки. Я отредактирую вопрос, чтобы показать.   -  person nicholas    schedule 16.09.2016
comment
Да, было бы неплохо. Но этот снимок не является массивом, это снимок Firebase, поэтому нет функции карты. Но я согласен, что было бы неплохо, если бы они добавили один.   -  person nicholas    schedule 17.09.2016


Ответы (1)


Разработчик Firebase Storage JS здесь.

Я запустил ваш код с небольшими изменениями[1] в Chrome и React Native и не заметил такого поведения.

Я вижу, что Promise.all всегда разрешается (никогда не дает сбоев) с пустой строкой в ​​массиве для недопустимых файлов. Это связано с тем, что ваш обработчик .catch для getDownloadURL возвращает пустую строку.

Для дальнейшего устранения неполадок было бы полезно знать:

  • версия библиотеки Firebase JS, которую вы используете
  • браузер/среда и версия
  • сетевые журналы, например, с сетевой панели в инструментах разработчика Chrome или аналогичные для других браузеров.

Группа Google firebase-talk лучше подходит для открытых закончилось устранение неполадок с большим количеством туда и обратно.

[1] Для справки, вот мой код:

const promises = [];

// Swap out the array to test different scenarios

// None of the files exist.
//const arr = ['nofile1', 'nofile2', 'nofile3'];

// All of the files exist.
const arr = ['legitfile1', 'legitfile2', 'legitfile3'];

// Some, but not all, of the files exist.
//const arr = ['legitfile1', 'nofile2', 'nofile3'];

arr.forEach(val => {
  const promise = firebase.storage()
    .ref(val)
    .getDownloadURL()
    .catch(err => {
      // This runs for nonexistent files
      console.log('caught', err);
      return "";
    })
    .then(imageURL => {
      // This runs for existing files
      return imageURL;
    });

  promises.push(promise);
});

Promise.all(promises)
  .catch(err => {
    // This never runs
    console.log('caught', err);
  })
  .then(urls => {
    // This always runs
    console.log('urls', urls);
  });
person sphippen    schedule 16.09.2016