Ошибка при попытке загрузить большой двоичный объект в хранилище Firebase (React Native) - PullRequest
0 голосов
/ 07 мая 2020

У меня есть компонент выбора изображений в моем приложении React-Native, который позволяет пользователям выбирать изображение. Затем он сохраняется в this.state.imageUri. Моя цель - загрузить изображение в хранилище Firebase, а затем связать его с базой данных в реальном времени, чтобы к нему можно было получить доступ по отношению к определенному элементу списка c. Я использую для этого две функции:

uriToBlob = (uri) => {
    console.log('uri: ' + uri)
    return new Promise(function(resolve, reject) {
      try {
          var xhr = new XMLHttpRequest();
          xhr.open("GET", uri);
          xhr.responseType = "blob";
          xhr.onerror = function() {reject("Network error.")};
          xhr.onload = function() {
              if (xhr.status === 200) {resolve(xhr.response)}
              else {reject("Loading error:" + xhr.statusText)}
          };
          xhr.send();
      }
      catch(err) {reject(err.message)}
    })
  }

и

uploadToFirebase = (blob) => {
    console.log('uploading to firebase')
    return new Promise((resolve, reject)=>{
      var storageRef = firebase.storage().ref();
      storageRef.child('uploads/photo.jpg').put(blob, {
        contentType: 'image/jpeg'
      }).then((snapshot)=>{
        blob.close();
        resolve(snapshot);
      }).catch((error)=>{
        reject(error);
      });
    });
  }

После нажатия кнопки я запускаю этот код:

this.uriToBlob(this.state.imageUri).then(function(blob) {
      return this.uploadToFirebase(blob)
    });

Однако я всегда получать ошибку

[Необработанное отклонение обещания: TypeError: undefined не является объектом (оценка 'this.uploadToFirebase')]

Я не работал с Firebase Storage или blobs раньше, поэтому я был бы очень признателен за понимание того, почему это не работает. Спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Проблема находится здесь:

this.uriToBlob(this.state.imageUri).then(function(blob) {
  return this.uploadToFirebase(blob)
});

Вы не используете стрелочную функцию, поэтому «this» на самом деле не тот контекст, который вы ищете (из родительской области).

Вместо этого вы должны сделать это:

this.uriToBlob(this.state.imageUri).then((blob) => {
  return this.uploadToFirebase(blob);
});
...