@vlad1753

Как решить проблему с WebSockets?

Приветствую.

Весьма странная ситуация. Первый раз использую веб сокеты.
При загрузке страницы клиент отправляет запрос на сервер.
Странность в том, что при первой загрузке страницы евент connection на бэкенде срабатывает 2 раза.
Вторая перезагрузка - 3 раза
Третья - 4 раза

Видео: https://www.recordjoy.com/view/V40Nzn77pFoShjC8O4H7

В чём причина???

Клиент:

const ws = new WebSocket('ws://localhost:8080')

const id = window.location.pathname.split('/')[2]

ws.onopen = () => {
        
    const message = {
        event: "transition",
        id
    }

    ws.send(JSON.stringify(message))

}

ws.onmessage = (message) => {
    console.log(message.data)
}

ws.onerror = (err) => {
    console.log(err)
}

window.onbeforeunload = () => {
    ws.close()
}


Сервер (это middleware в express):

import { WebSocketServer } from 'ws'
import linkService from '../services/link.js'
import transitionService from '../services/transition.js'


const wss = new WebSocketServer({ port: 8080 })

export default function(req, res, next){


 
    wss.on('connection', ws => {
        console.log('connection')
        
        if(req.autorized){
            ws.clientID = req.user._id
        }

        
        ws.on('message', async (message)=>{

            const data = JSON.parse(message.toString())


            switch (data.event) {
                case "transition":
                    const linkData = await linkService.saveFollowData(req.socket.remoteAddress, req.get('user-agent'), data.id)
                    wss.clients.forEach(c => {
                        if(c.clientID == linkData.user){
                            transitionService.getData(linkData.user).then((data)=>{
                                c.send(JSON.stringify(data))
                            })
                        }
                    })
                    ws.send(linkData.from)
                    break;
            
                default:
                    break;
            }
        })
    })
    next()
}
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Вы на каждый запрос по http, который обрабатывается Вашим middleware делаете подписку на websocket connection, тем самым плодите обработчики.
У Вас вебсокет вообще никак не связан с http и сидит на отдельном порту.

При желании, кстати можно переиспользовать инстанс http сервера и для express и для websocket, тогда они на одном порту будут.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы