Ошибка перехвата JSON Ошибка разбора: нераспознанный токен '<' - реакция-нативный - PullRequest
0 голосов
/ 28 марта 2020

У меня есть нативное приложение, которое работает хорошо на многих устройствах, в последнее время я получаю «Ошибка Catch JSON Ошибка разбора: нераспознанный токен« <»на некоторых устройствах, Android и IOS , </p>

См. Код

fetch(url, {method: 'POST', headers: {Authorization : `Bearer ${user.token}`}})
            .then(response => {
                const statusCode = response.status;
                const responseJson = response.json();
                return Promise.all([statusCode, responseJson]);
            })
            .then(res => {
                const statusCode = res[0];
                const responseJson = res[1];
                // console.log(responseJson);
                if (statusCode == 200) {
                    if (responseJson.reload.status != 1 ) {
                        Alert.alert(I18n.t('phrases.transaction_failed'), I18n.t('phrases.transaction_not_completed') + ' - ' + responseJson.transaction.status_desc)
                    }else{
                        Actions.success({data: responseJson});
                    }
                }else if(statusCode == 422){
                    alert('missing fields');
                    console.warn(responseJson);
                }else{
                    Alert.alert(I18n.t('words.error'), responseJson.message);
                    console.log(res);
                }
            })
            .catch(err => {
                alert('Catch Error ' + err.message);
                console.log(err);
            }).finally( fin => this.setState({ loading: false }) )
    }

1 Ответ

1 голос
/ 28 марта 2020

Возможно, проблема в том, что в некоторых ситуациях вызываемая конечная точка не возвращает JSON, она возвращает HTML, вероятно, страницу ошибки, сопровождающую ошибку HTTP. Поэтому вам нужно проверить это в своем приложении и выяснить, почему это происходит в некоторых ситуациях, а не в других.

Так почему же вы пытаетесь проанализировать HTML как JSON? Вы не показали нам никакого кода, но я предполагаю, что вы столкнулись с леггинсом в fetch API и у вас есть такой код:

fetch("/your/endpoint")
.then(response => response.json()) // <=== This is the footgun
.then(data => {
    // ...use the data...
})
.catch(error => {
    // ...report the error...
});

Проблема в том, что fetch не не отклоняйте обещание об ошибках HTTP, только об ошибках сети. Вам нужно убедиться, что вы не получили HTTP 500, 404 и т. Д. c. код статуса:

fetch("/your/endpoint")
.then(response => {
    if (!response.ok) {
        throw new Error("HTTP error " + response.status);
    }
    return response.json();
})
.then(data => {
    // ...use the data...
})
.catch(error => {
    // ...report the error...
});
...