Socket.io: CORS

Созданный на 3 февр. 2017  ·  11Комментарии  ·  Источник: socketio/socket.io

привет,

как удалить заголовок ответа Access-Control-Allow-Origin ?
похоже в настройках {'origins' : 'asfdasd.com'} не работает.

POST /socket.io/?EIO=3&transport=polling&t=1481690658797-5&sid=Dp18NNt_bWPkB4rGAAAP HTTP / 1.1
Происхождение: https://evilhost.net

HTTP / 1.1 400 неверный запрос
Тип содержимого: приложение / json
Access-Control-Allow-Credentials: правда
Доступ-Контроль-Разрешить-Происхождение: https://evilhost.net
Дата: пт, 3 февраля 2017 г., 12:27:42 GMT
Подключение: keep-alive
Кодирование передачи: фрагментированное

Самый полезный комментарий

@thEpisode Я понимаю, что это старая ветка, но именно эта последняя ссылка исправила ее для меня! В большинстве руководств по Express есть app.listen(...) но в случае использования socket.io вы должны быть уверены, что в вашем index.js вы вызываете http.listen(...) и НЕ слушаете объект app , или вы получите эту проблему CORS. Такая мелочь!

Все 11 Комментарий

Та же ошибка

@Kenzku @thEpisode Какую версию socket.io вы используете?

Это должно быть исправлено в 2.x (включая https://github.com/socketio/engine.io/pull/452).

Привет, @darrachequesne, спасибо за ответ. Я создатель сайта Crawler (https://www.crawlersite.com), и мы используем Socket.io для отправки данных на наши серверы, и вся наша инфраструктура находится в Microsoft Azure, все тестовые и первые бета-тестеры используют Azure, а у нас нет Нет проблем, но новый бетатестер использовал другого поставщика облачных услуг, и он сообщил об ошибке. Проблема в CORS, все вопросы читаем в гугле !! При поиске решений мы замечаем, что Socket.io обновлен до версии 2.0 (точно до версии 2.0.1 на сервере), мы обновляем клиент и сервер, но проблема сохраняется, мы используем Express, который также сообщил о проблемах с CORS, и мы их решили.

Мы очень разочарованы, потому что все решения в Google не помогли решить проблему, извините за то, что не разместили это на GitHub issues или StackOverflow, но мы хотим предоставить все подробности, которые можно решить. Некоторые URL-адреса для тестирования:

Backend URI: http://crawlerbackend.azurewebsites.net
Тестирование Express CORS: https://testcors.000webhostapp.com (этот хостинг используется тестером)
Тестирование Socket.io CORS: https://testcrawlersite.000webhostapp.com (см. Консоль)
Наш основной сайт для тестирования: http://crawler-test.azurewebsites.net (с новыми модификациями также не работает)
Файл Socket.io: http://crawlerbackend.azurewebsites.net/socket.io.js

Часть нашего app.js:
`
var path = require ('путь');
var bodyParser = require ('body-parser');
var cors = require ('cors');
var express = require ('экспресс');
вар приложение = экспресс ();

// use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(bodyParser.json()); // support json encoded bodies
app.use(cors({ origin: '*' }));
// Settings for CORS
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.header('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', false);

    // Pass to next layer of middleware
    next();
});

var server = app.listen(cross.NormalizePort(process.env.PORT || 3500));
var io = require('socket.io').listen(server, {
    log: false,
    agent: false,
    origins: '*:*',
    transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
});

`

Проблема решена!! @Kenzku, пожалуйста, просмотрите эту документацию: https://github.com/socketio/socket.io/blob/master/docs/API.md#serveroriginsvalue и посмотрите код: https://github.com/socketio/socket.io /blob/master/lib/index.js#L67 и проверьте, используете ли вы Express (этот пример очень полезен): https://github.com/socketio/socket.io#in -conjunction-with-express

Большой! Думаю, мы можем закрыть вопрос сейчас.

@thEpisode Я понимаю, что это старая ветка, но именно эта последняя ссылка исправила ее для меня! В большинстве руководств по Express есть app.listen(...) но в случае использования socket.io вы должны быть уверены, что в вашем index.js вы вызываете http.listen(...) и НЕ слушаете объект app , или вы получите эту проблему CORS. Такая мелочь!

@frewinchristopher Я следую тому же шаблону, что и вы упомянули выше, локально он работает нормально, но на удаленном он выдает (Причина: запрос CORS не удался). где я не прав ..?

@gowthamyaal не могли бы вы показать нам свой код?

Спасибо за вашу озабоченность, но проблема CORS решена, так как я использовал AWS, возник конфликт с эластичным IP-адресом и локальным IP-адресом, позже я изменил IP-адрес прослушивания сокета на 0.0.0.0, это решило мою проблему.

Теперь, столкнувшись с проблемой состояния гонки в удаленном режиме, я использую webpack-dev-config, я пытался использовать io connect и выдавать код в том же файле, но в итоге получил неопределенную ошибку

webpack-dev-config

код клиентского сокета
;)

прокомментированные строки действительно сработали для меня .... может ли кто-нибудь помочь мне с этим .... заранее спасибо

Я воспользовался всеми решениями, которые смог найти, но до сих пор не отправил рабочий ответ. Если бы кто-нибудь мог взглянуть, я был бы очень признателен.

`const express = require ('экспресс')
const http = require ('http')
const socketIO = требуется ('socket.io')
const cors = require ('cors')

// Хост-порт
const порт = 3001

const приложение = экспресс ()
app.use (cors ())
// Экземпляр сервера
const server = http.createServer (приложение)
// Создание сокета с использованием экземпляра сервера
const io = socketIO (сервер)

io.origins ("http: // localhost: 3000")

io.on ('соединение', socket => {
console.log ("Пользователь подключен")

socket.on('disconnect', () => {
    console.log("User Disconnected")
})

socket.on('send message', (message) => {
    io.sockets.emit('send message', message)
})

})

server.listen (порт, () => console.log ( Listening on port ${port} )) `

Была ли эта страница полезной?
0 / 5 - 0 рейтинги