Собственное приложение React, использующее rn-fetch-blob, вылетает, если сервер возвращает ошибку

#react-native #rn-fetch-blob

Вопрос:

Я пытаюсь научиться реагировать на родной язык, и в процессе я пытаюсь загрузить файл с помощью rn-fetch-blob, используя следующий код

         var url = APIPREFIX   '/image/download/'   image.id;
        var config = {
            path: ((Platform.OS === 'ios') ? RNFetchBlob.fs.dirs.DocumentDir : RNFetchBlob.fs.dirs.DownloadDir)   '/'   image.fileName,
        };
    
        RNFetchBlob.config(config)
            .fetch('GET', url)
            .then((res) => {
                    var path = res.path();
                    
                    if (Platform.OS === 'ios') {
                        RNFetchBlob.ios.previewDocument(path)
                    } else {
                        RNFetchBlob.android.actionViewIntent(path, image.image ? "image/png" : image.type);
                    }
            }).catch((errorMessage) => {
                    console.log(errorMessage);
                    // no special error handling required.
                    // added this line to check if an error is being returned
                });
 

Это работает правильно, когда сервер возвращает файл (который всегда будет файлом изображения). Однако, если сервер возвращает какую — либо ошибку (обычно 404 или 401) — приложение завершает работу.

adb logcat показывает следующие строки

 05-05 22:40:09.984   518  2945 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
05-05 22:40:10.038  8846  9054 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
05-05 22:40:10.038  8846  9054 E AndroidRuntime: Process: com.downloadTest, PID: 8846
05-05 22:40:10.038  8846  9054 E AndroidRuntime: java.lang.ClassCastException: okhttp3.internal.http.RealResponseBody cannot be cast to com.RNFetchBlob.Response.RNFetchBlobFileResp
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at com.RNFetchBlob.RNFetchBlobReq.done(RNFetchBlobReq.java:594)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at com.RNFetchBlob.RNFetchBlobReq.access$100(RNFetchBlobReq.java:72)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at com.RNFetchBlob.RNFetchBlobReq$3.onResponse(RNFetchBlobReq.java:493)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:203)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
05-05 22:40:10.038  8846  9054 E AndroidRuntime:        at java.lang.Thread.run(Thread.java:923)
05-05 22:40:10.041   518  2945 W ActivityTaskManager:   Force finishing activity com.downloadTest/.MainActivity
 
 "react": "16.13.1"
"react-native": "^0.64.0"
"rn-fetch-blob": "^0.12.0"
Android Version: 10
Android Simulator Version: 11

 

Поведение одинаково для симулятора Android/устройства Android/симулятора iOS/устройства iPhone.

В некоторых статьях здесь говорится о выпуске 0.12.1, но я не могу узнать, как его загрузить — и имеет ли это отношение к делу. В некоторых ответах говорится об изменении AndroidManifest, чтобы разрешить доступ к файловой системе, но, похоже, проблема не в этом

Я прошу помощи, чтобы понять, как решить эту проблему или справиться с ней в моем коде.