Я получаю 400 с сообщением {"code":2,"message":"Bad handshake method"}
при попытке подключить мой сервер с дополнительным заголовком (работает нормально, если я не пытаюсь его добавить).
Я пытаюсь подключить свой сервер со следующей конфигурацией:
const options = {
transportOptions: {
polling: {
extraHeaders: {
Authorization: "Bearer test"
}
}
}
};
Я также заметил, что запрос OPTIONS создается, когда я добавляю этот дополнительный заголовок (вместо GET, когда я его не добавляю)
Запрос на получение GET (для сохранения файлов cookie) с дополнительными заголовками, которые не нарушают рукопожатие.
Та же проблема, здесь ... полностью работает с версией socket.io-client для nodejs, но не с браузером
Привет! Я думаю, вам нужно добавить правильные заголовки на стороне сервера (похоже, вы находитесь в ситуации CORS):
const io = require('socket.io')(3000, {
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': 'http://localhost:3001',
'Access-Control-Allow-Credentials': true
};
res.writeHead(200, headers);
res.end();
}
});
Я добавил туда пример: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers
@darrachequesne, как указать несколько доменов для происхождения, следующие способы не работают:
@DaVincii я определен как null, но освобождается для любого домена.
const headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': ноль,
'Access-Control-Allow-Credentials': истина
};
Для использования CORS
{
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': истина
};
res.writeHead (200, заголовки);
Отправить();
}
}
Для использования CORS
{
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': истина
};
res.writeHead (200, заголовки);
Отправить();
}
}
'Access-Control-Allow-Origin': req.headers.origin
Это просто спасло мне день! Когда я использовал:
'Access-Control-Allow-Origin': ' ',Это дало бы мне следующую ошибку:«Значение заголовка« Access-Control-Allow-Origin »в ответе не должно быть подстановочным знаком» , когда режим учетных данных запроса - «включить». Режим учетных данных запросов, инициированных XMLHttpRequest, контролируется атрибутом withCredentials . "
Похоже, это больше не работает с последней версией socket.io. Машинописцу это не нравится. Все равно исправить?
Похоже, это больше не работает с последней версией socket.io. Машинописцу это не нравится. Все равно исправить?
@ supertiger1234 handlePreflightRequest
в последней версии имеет другой интерфейс
Так что в вашем случае это должно быть:
...
handlePreflightRequest: function(server, req, res) {
var headers = {
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Allow-Origin": config.allowedOrigins,
"Access-Control-Allow-Credentials": true,
};
res.writeHead(200, headers);
res.end();
...
@ supertiger1234 handlePreflightRequest в последней версии имеет другой интерфейс
⚠️ Если вы установите socket.io прямо сейчас из npm, у вас будет старая версия, но если вы установите типизацию (через @types), она будет иметь новую типизацию! Что может вводить в заблуждение.
Как установить последнюю версию socket io?
Для справки в будущем: эта проблема также возникает при использовании сервера post-3.0 с клиентом pre-3.0. Это может быть вызвано неверно настроенным кешем, из-за которого клиенты используют старую версию socket.io.js
.
Для будущих читателей см .:
Самый полезный комментарий
Привет! Я думаю, вам нужно добавить правильные заголовки на стороне сервера (похоже, вы находитесь в ситуации CORS):
Я добавил туда пример: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers