Проблема Angular CORS - Опрос конечной точки каждые 5 секунд
У меня есть угловое приложение, которое запрашивает конечную точку узла / экспресс-сервера каждые 5 секунд. Тем не менее, иногда я получаю ошибку Cors.
USECASE
- Пользователь создает транзакцию. Транзакция добавляется в базу данных со статусом "Ожидание"
- Интерфейс периодически запрашивает базу данных, пока статус не будет обновлен до "Завершено". Таким образом, он может получить результаты.
угловатый
Каждые 5 секунд я делаю http запрос на получение
const url = 'https://<removed>.com/api/v1/transactions/' + transactionId;
interval(5000)
.pipe(
switchMap(() => this.httpClient.get(url)),
tap((response: any) => {
this.summary = response;
}),
takeWhile((response: any) => response.data['status'] !== 'Completed'),
).subscribe();
}
Первый запрос в порядке, затем я получаю следующую ошибку при следующем запросе.
Не удалось загрузить https://"".com/api/v1/ Transactions/f3debad2-a830-4168-9a03-475389dae7e0: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:4200/', следовательно, не имеет доступа. Ответ имел HTTP-код состояния 502.
Блокировка перекрестного чтения (CORB) заблокировала ответ перекрестного происхождения https://"".com/api/v1/ Transactions / f3debad2-a830-4168-9a03-475389dae7e0 с типом MIME text/html. См. https://www.chromestatus.com/feature/5629709824032768 для получения дополнительной информации.
Опять же, это случается иногда, иногда я могу сделать столько запросов, сколько захочу, с 200 ответами.
Узел
Я установил CORS в своем бэкэнде.
app.use(cors());
Заметка
Я не уверен, что это полная проблема на стороне сервера. Это случайный крайний случай. Все мои другие запросы API, включая запросы POST, работают нормально.
Фактически, прежде чем запустить интервал в 5 секунд, чтобы проверить, готовы ли результаты, он отправляет сообщения в конечную точку в том же домене без проблем.
Я сделал 10 тестовых случаев, каждый тест будет запрашивать конечную точку 3-4 раза (обычно это занимает много времени, прежде чем результаты будут готовы / завершены). Все 10 тестов могут быть в порядке, тогда как 11-й может иметь эту проблему.
1 ответ
Не знаю, решили ли вы свою проблему за эти 2 года. Но вчера я столкнулся с той же ошибкой.
Сначала я подумал, что это тоже проблемы с CORS, после того, как я увидел потерю заголовков во втором вызове и тег "keep-alive" в заголовках, я не нашел ничего о своем обещании, поэтому я пытаюсь закрыть автоматический keep-alive ', ожидая несколько раз.
Я не использую takeWhile для создания цикла. Я предпочитаю цикл for, потому что в нем можно использовать функцию ожидания.
for(const list of lists){
await this.httpClient.get(url).toPromise();
await this.delay(500);
}
delay(ms: number) {
return new Promise( resolve => setTimeout(resolve, ms) );
}
Я пробую 100 и 200 мс, но у меня это не работает.
Надеюсь, это вам поможет.
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.setHeader('Access-Control-Expose-Headers','Content-Type,expire');
next();
});
Попробуйте это на своем сервере. Если вы хотите передать дополнительный параметр заголовка, вам нужно добавить эти переменные в res.setHeader('Access-Control-Allow-Headers', 'Content-Type , token');
но помните, не используйте '-' в имени переменной.