Ошибка при рукопожатии WebSocket: отсутствует заголовок Connection

Я совершенно новичок в Node и даже новичок в Socket.io. Я только что получил свое первое приложение для чата онлайн на spaiglas.com, которое работает, несмотря на ошибку в консоли разработчика, которая довольно проста ...

WebSocket connection to 'ws://example.com/...' failed
: Error during WebSocket handshake
: 'Connection' header is missing

Вот кодовый ключ со всем моим кодом. Я загрузил его своему хостинг-провайдеру, который использует Passenger через cPanel на сервере Apache в среде Node 9.11.2.

Из того, что я читал, заголовки «Соединение» нельзя установить с помощью AJAX, что предположительно представляет угрозу безопасности, но вместо этого обрабатывается сервером? Можно ли вручную установить этот заголовок?

Я заметил, глядя на заголовки, что на раннем этапе обычно один из них всегда успешно переключает / обновляет протокол до WebSockets, но затем платформа всегда возвращается к HTTPS / опросу. В приведенном ниже случае, который я только что наблюдал, на самом деле было 2 из 67 случаев, когда он успешно переключился на протокол WebSockets и использовал его.

Ошибка при рукопожатии WebSocket: отсутствует заголовок Connection

Ошибка при рукопожатии WebSocket: отсутствует заголовок Connection

У меня такая же проблема. Вы решили свою проблему?

Hermes 08.03.2019 08:43

Я установил nginx и решил свою проблему

Hermes 08.03.2019 10:45

@Hermes, я не думаю, что когда-либо решал проблему, но я действительно не стал пытаться ее решить, так как длинный опрос работал отлично

oldboy 08.03.2019 19:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
3 775
1

Ответы 1

Вам необходимо инициализировать socket.io перед запуском HTTP-сервера, который прослушивает порт 80. В документации это ...

var http = require('http').Server(app);
var io = require('socket.io')(http);

А потом вы звоните http.listen(3000, ...). Это запустит сокет.

На клиенте ваш путь тоже неверен. Websockets - это протокол (ws://somedomain.com), как и HTTP. Когда вы подключаетесь через http://, это другой протокол. Я бы либо ничего не передавал, либо использовал пространства имен, которые вы можете найти в документации socket.io.

Socket.io возвращается к длительному опросу и иногда даже не использует веб-сокеты (отчасти поэтому он обычно медленнее, чем такие библиотеки, как ws на npm). Из-за этого передача http: // в io (...) на клиенте может быть правильной с их библиотекой, но я бы все равно удалил ее и сделал свое предложение выше.

да, я инициализировал все это, что можно увидеть в коде. Думаю, мне просто нужно заменить socket = io.connect(...) на socket.io('url', { /* extraHeaders here*/ }). Я почти уверен, что если я установлю протокол на ws, тогда, когда веб-сокеты не работают и по умолчанию используется опрос, он сломается, не так ли?

oldboy 16.12.2018 04:04

проблема в том, что мне нужно выяснить, как установить заголовок "соединение"

oldboy 16.12.2018 04:08

на сервере порядок имеет значение. Вам нужно сделать то, что я сказал. В коде кода вы запустили прослушивание сервера до того, как запустили сервер socket.io. вам нужно изменить это, чтобы создать сервер, но не запускать его прослушивание. а затем запустите socket.io, а затем запустите прослушивание сервера. на клиенте просто удалите строку, которую вы ему передали. Это должно быть io.connect (), а не socket.io ("url", ...}

Andrew Duca 16.12.2018 04:12

У меня уже была эта проблема, как и у вас. это порядок вашего кода на сервере. ваш клиент в порядке, просто удалите строку в io.connect ()

Andrew Duca 16.12.2018 04:13

Хм? как мне не инициализировать socket.io перед инициализацией сервера? app = express() инициализирует сервер?

oldboy 16.12.2018 04:20

Я новичок во всем этом помню. Также, кстати, ты прав, я удалил протокол, так что теперь его просто io.connect('example.com:80')

oldboy 16.12.2018 04:41

@Gihan Saranga Siriwardhana есть идеи?

oldboy 16.12.2018 06:26

Если бы вы просто попробовали мое решение, оно бы исправлено. Причина, по которой ваш код не работает, заключается в том, что app = express () не запускает сервер. он инициализирует его, но сервер не запускается, пока вы не вызовете listen (). вам нужно убедиться, что вы вызываете listen для сервера ПОСЛЕ запуска socket.io.

Andrew Duca 25.05.2019 22:38

Другие вопросы по теме