Как исправить приложение Expo для Android, которое не может выполнять более 2 HTTP-запросов подряд

У меня неприятная проблема, которая влияет только на мое приложение expo на Android.

Я пытаюсь загрузить изображение base64, снятое с expo ImagePicker, в Хранилище Firebase, передавая значение изображения с http-запросом, сделанным с axios, в Облачная функция Firebase, который возвращает URL-адрес сохраненного изображения. Этот URL-адрес входит в Пожарный магазин, но я думаю, что это вне досягаемости моего вопроса.

Моя текущая реализация работает безупречно в IOS (я могу получить столько URL-адресов, сколько хочу, на самом деле они загружаются довольно быстро), но в Android я могу загружать только 2 изображения подряд; когда я пытаюсь в третий раз, мое приложение зависает при достижении оператора axios / fetch * и не дает ни малейшего представления о том, что произошло. Консоль такая же, как и до третьей попытки, и приложения или симуляторы зависают.

Вот это поведение можно увидеть в двухминутном видео:

https://thewikihow.com/video_w66iXnKDmdo

Когда я начал работать над этой ошибкой, я использовал fetch вместо axios. В то время проблема заключалась в том, что я мог загрузить только одно изображение. Пришлось закрыть и снова открыть приложение, чтобы загрузить еще одно. Теперь с помощью axios я могу загрузить 2 из них, но проблема не устранена.

Вот как я реализовал код:

const imageBase64 = 'QWEpqw0293k01...'

Вот как я загружаю изображение в Firebase Cloud Storage:

export const savePhoto = (imageBase64) => {
  const db = firebase.firestore();
  const docRef = db.collection('Comidas').doc();
  return () => {
    uploadImageToFirestore(imageBase64)
    .then(imageUrl => {
      console.info('image-url: ', imageUrl);
      docRef.set({ imagen: { uri: imageUrl }, });
    })
    .catch(err => console.info('error: ', err));
  };
};

Я создал вспомогательную функцию, которая позволяет мне повторно использовать http-запрос:

import axios from 'axios';

export const uploadImageToFirestore = (imageBase64) => {
//<--- here is where it get frozen the third time
//<--- console.info() calls three times but not axios
  return axios({
    method: 'post',
    url: 'https://us-central1-menuapp-9feb4.cloudfunctions.net/almacenamientoImagen',
    data: {
      image: base64
    },
  })
  .then(res => res.data.imageUrl)
  .catch(err => console.info('error while uploading base64: ', err));
};

При этом вызывается следующая облачная функция Firebase:

exports = module.exports = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const body = req.body;
    console.info('image: ', body.image);
    fs.writeFileSync("/tmp/uploaded-image.jpg", body.image, "base64", err => {
  console.info(err);
  return res.status(500).json({ error: err });
});
const bucket = gcs.bucket("myapp.appspot.com");
const uuid = UUID();

bucket.upload(
  "/tmp/uploaded-image.jpg",
  {
    uploadType: "media",
    destination: "/comidas/" + uuid + ".jpg",
    metadata: {
      metadata: {
        contentType: "image/jpeg",
        firebaseStorageDownloadTokens: uuid
      }
    }
  },
  (err, file) => {
    if (!err) {
      console.info('url: ', {
        imageUrl:
          "https://firebasestorage.googleapis.com/v0/b/" +
          bucket.name +
          "/o/" +
          encodeURIComponent(file.name) +
          "?alt=media&token = " +
          uuid
      });

      res.status(201).json({
        imageUrl:
          "https://firebasestorage.googleapis.com/v0/b/" +
          bucket.name +
          "/o/" +
          encodeURIComponent(file.name) +
          "?alt=media&token = " +
          uuid
      });
    } else {
      console.info(err);
      res.status(500).json({ error: err });
    }
  }
  );
 });
});

Я знаю, что axios он не вызывается, потому что нет ни журнала, ни реестра выполнения функции Firebase Cloud.

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

Как я могу это решить?

Что делать, если вы дождетесь завершения одного из изображений, прежде чем пробовать другое. Если это сработает, библиотека, клиент или сервер могут иметь ограничение на количество соединений, которые он разрешает открывать между одной парой клиента и сервера.

Frank van Puffelen 05.01.2019 04:21

Спасибо за ответ @FrankvanPuffelen. Это то, что я делаю. Под «подряд» я подразумеваю полный цикл кода, упомянутого выше. Требуется одно изображение, он получает URL-адрес и сохраняет хранилище огня. Этот процесс начинается и завершается два раза. При третьей попытке зависает вообще без обратной связи. Я опубликую короткое видео, чтобы лучше продемонстрировать поведение.

Felipe Font 05.01.2019 04:39

@FrankvanPuffelen Пост обновлен видео: youtu.be/w66iXnKDmdo

Felipe Font 05.01.2019 05:06

Хм .... в таком случае я понятия не имею. Надеюсь, кто-нибудь еще увидит проблему.

Frank van Puffelen 05.01.2019 05:17
0
4
72
0

Другие вопросы по теме