@Sokolov09

Как создать кроссдоменный запрос в nodejs?

Суть задачи:

есть группа сайтов: которые подключаются к серверу на nodejs и слушают.
Как только на сервере срабатывает событие идет широковещательная рассылка.

В чем проблема:

EventSource cannot load https://[url-server]:8081/event. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'https://[url-client]' is therefore not allowed access.

Так работает но только для 1 домена:

'GET /event': function (request, response) {
response.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': 'https://[uri-client]',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE',
"Access-Control-Allow-Headers": "Origin,X-Requested-With, Content-Type, Accept"
});
request.socket.setTimeout(3000 * 60 * 60);
request.on('close', function () {
Clients.remove(response);
});
Clients.add(response);
},

Поискав в интернете, нашел решение: надо указать
'Access-Control-Allow-Origin': '*',

Но это не привело к успеху...

'GET /event': function (request, response) {
response.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': '*',
});
request.socket.setTimeout(3000 * 60 * 60);
request.on('close', function () {
Clients.remove(response);
});
Clients.add(response);
},

Пробовал добавлять
'Access-Control-Allow-Credentials': 'false',
и
'Access-Control-Allow-Credentials': null,

Все-равно безрезультатно - выскакивает та самая ошибка.

Я думаю может тому виной ssl соеденение?
Или каких-то хеадеров не хватает?
  • Вопрос задан
  • 959 просмотров
Решения вопроса 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Вообще всю жизнь так работало:
res.writeHead(200, {
  'Content-Type': 'text/event-stream; charset=UTF-8',
  'Cache-Control': 'no-cache',
  'Connection': 'keep-alive',
  'Access-Control-Allow-Credentials': true,
  'Access-Control-Allow-Origin': '*'
});

Но если не работает, то сделайте параметр в урле SSE обработчика https://[url-server]:8081/event?domain=[uri-client] и подставляйте не *, а для каждого свой свой домен.
Кроме того, постарайтесь вешать не на 8081, а все на 80, браузеры, фаерволы и разные шлюзы любят когда все на 80. Да и балансировку тогда будет сделать проще, хардварные балансировщики и специализированные сервисы балансировки любят 80.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы