Конструктор ws Server
не принимает параметр app
, поэтому ваш wss
фактически ничего не слушает. Если этот точный код работал локально, трудно понять, как.
Поскольку вы пытаетесь подключиться к WebSocket, который использует тот же путь, что и ваша страница, приложение express завершает работу с клиентом WebSocket. запросить и ответить вашей страницей HTML.
Ваш HTTP-обмен в конечном итоге выглядит примерно так: сначала браузер загружает страницу:
GET /page HTTP/1.1
Accept: text/html
…
HTTP/1.1 200 OK
Content-Type: text/html
<html> …
Затем страница создает new WebSocket(…)
, что приводит к запросу на обновление WebSocket:
GET /page HTTP/1.1
Connection: Upgrade
Upgrade: websocket
…
HTTP/1.1 200 OK
Content-Type: text/html
<html> …
Вы должны увидеть, почему это не получится: это не ответ WebSocket. Express считает запрос обычным HTTP GET
запросом и отвечает HTML вашей страницы. Реализация WebSocket в браузере видит ответ, который не соответствует спецификации WebSocket c и по ошибке выдает ошибку. Он сообщает «статус 200», потому что сервер ответил с кодом состояния HTTP 200 - даже если это был несчастный случай.
Правильный способ присоединить ws Server
к HTTP сервер может:
Передать http.Server
( not express приложение) в ws.Server
server
параметр
var app = express(),
server = http.createServer(app),
wss = new ws.Server({ server });
server.listen(process.env.PORT);
Или вручную подключите upgrade
слушателя к вашему http.Server
и позвоните wss.handleUpgrade
.