Вк network error typeerror failed to fetch

Вк network error typeerror failed to fetch

Я использую fetch API в своем приложении React. Приложение было развернуто на сервере и работало отлично. Я тестировал это несколько раз. Но внезапно приложение перестало работать, и я понятия не имею, почему. Проблема в том, что когда я отправляю get запрос, я получаю действительный ответ от сервера, но также fetch API улавливает исключение и показывает TypeError: Failed to fetch. Я даже не вносил никаких изменений в код, и это проблема со всеми компонентами React.

Но в то же время и получение этой ошибки:

fetch(url)

.then(res => res.json())

.then(data => {

  // do something with data

})

.catch(rejected => {

  console.log(rejected);

});

Когда я удаляю учетные данные: “включить”, это работает на localhost, но не на сервере.

Я перепробовал все решения, представленные в StackOverflow и GitHub, но у меня просто не получилось.

Ответ

Это может быть проблемой с ответом, который вы получаете от серверной части. Если на сервере все работало нормально, проблема могла быть в заголовках ответа.

Проверьте значение Access-Control-Allow-Origin в заголовках ответа. Обычно fetch API выдает ошибку выборки даже после получения ответа, когда заголовки ответа ‘ Access-Control-Allow-Origin и источник запроса не совпадают.

Почему возникает TypeError: Failed to fetch при запросе к серверу из VK Mini App только из приложения на Android?

На сервере запущен Express-сервер, у него разрешены кроссдоменные запросы, настроен сертификат, и у браузеров нет проблем с тем, чтобы получить оттуда статическую страницу, или сделать на него запрос к API, в том числе, если приложение запущено в браузере на сайте ВК (статика подгружается из ВК, поэтому запросы кроссдоменные).

const app = express();

app.use(cors({origin: “*”,}));

// …

t = https.createServer({key:pk,cert:sf},app);

t.listen(443,()=>{console.log(“start”)});

Более того, если открыть приложение в официальном клиенте на iOS, то запросы к серверу также проходят, и всё работает.

И только если приложение открыто в официальном клиенте на Android, запрос не просто не успешно завершается, а он даже, возможно, не начинается, выкидывая исключение TypeError: Failed to fetch.

Я добавил в приложение консоль Eruda, чтобы посмотреть на код запроса или заголовки, но даже их нет, в консоли (во вкладке работы с сетью) просто написано pending… и статус unknown.

При этом, точно такой же код при обращении к сторонним доступным извне API, типа курсов валют (используя GET, но GET также не работает в случае моего сервера), работает прямо из приложения:

const requestOptions = {

  method: ‘POST’,

  body: JSON.stringify(jsonData),

  headers:{‘content-type’: ‘application/json’},

};

try

{

  let zapros = await fetch(myURL, requestOptions);

// …

Проблема возникла точно не из-за кроссдоменности, так как изначально я хостил и API, и статику, но статику получилось выгрузить в ВК через их технологию Deploy, а до этого приложение не получало даже статики и вечно загружалось, в то время как браузеры на всех моих устройствах не видели проблем с тем, чтобы получить от моего сервера как статику, так и ответ на POST-запрос.

Нашёл решение:

Проблема оказалась в том, что был указан только сертификат и закрытый ключ, а корневой и промежуточный сертификаты не были указаны в настройках Express-сервера:

l

et pk = fs.readFileSync(“key.key”);

let sf = fs.readFileSync(“сert.crt”);

// Добавлено:

let root_c = fs.readFileSync(“root.crt”); // Корневой сертификат

let prom = fs.readFileSync(“prom.crt”); // Промежуточный сертификат

t = https.createServer({key:pk,cert:sf,ca:[root_c,prom]},app);

То есть, браузерам было достаточно и двух “частей” сертификата, а вот приложению – нет

Наталья Петрова
Оцените автора
Новости города Салавата
Добавить комментарий

Adblock
detector