В чем проблема с соединением socketio? - PullRequest
0 голосов
/ 22 марта 2020

У меня много запросов http ( 6k INSIDE LAGGING ) за 1-3 минуты в консоли, когда я получаю или отправляю данные на соединение socketio.

Im используя узел + express в бэкэнде и vue на фронте

enter image description here Бэкэнд:

приложение. js

mongoose.connect('mongodb://localhost/app',{useNewUrlParser:true,useFindAndModify:false})
    .then(result =>{
        const server = app.listen(3000)
        const io = require('./sockets/socket').init(server)
              io.on('connection', socket =>{
                //   console.log('client connected')
              })
        if(result){console.log('express & mongo running');
        }
    })
    .catch(error => console.log(error))

Я создал экземпляр io для использования на маршрутах

let io
module.exports = {
    init: httpServer => {
        io = require('socket.io')(httpServer)
        return io;
    },
    getIo:()=>{ 
        if(!io){
            throw new Error('socket io not initialized')
        }
        return io;
    }
}

Затем на route, в зависимости от логики c, если if, то выберите тип ответа сокета

router.post('/post/voteup',checkAuthentication, async (req,res)=>{
    //some logic
    if(a.length <= 0){
     io.getIo().emit('xxx', {action:'cleanAll'})
    }
    else if(b.length <= 0){
     io.getIo().emit('xxx', {action:'cleanT',datoOne})
    }
    else{                   
     io.getIo().emit('xxx', {action:'cleanX',dataTwo,dataOne,selected})
    }
    res.json({ serverResponse:'success'})
})

Спереди (компонент) (активируется с помощью ловушки жизненного цикла beforeUpdate)

getData(){
    let socket = openSocket('http://localhost:3000')
        socket.on('xxx', data => {
        if(data.action === 'cleanX'){
            if(this.selected === data.selected){
                this.ddd = data.dataTwo
            }
            else if(!this.userTeamNickname){
                this.qqq= data.dataOne
            }
        }
        else if(data.action === 'cleanAll'){
            this.ddd= []
            this.qqq= []
        }
        else if(data.action === 'cleanT'){
            this.ddd= data.dataOne
        }
    })            
},

1. Какое поведение может вызвать такую ​​ошибку? 2. Есть ли другой наиболее эффективный способ сделать это?

1 Ответ

1 голос
/ 22 марта 2020

Похоже, что socket.io не может установить sh соединение webSocket и никогда не выходил из опроса. По умолчанию соединение socket.io начинается с опроса http и после небольшого согласования с сервером пытается установить sh соединение webSocket. Если это удается, он прекращает опрос и использует только соединение webSocket. Если соединение webSocket не удается, он просто продолжает опрос.

Вот несколько причин, которые могут произойти:

  1. У вас несовместимая версия socket.io на клиенте и сервере .
  2. У вас есть часть инфраструктуры (прокси, брандмауэр, балансировщик нагрузки и т. Д. c ...) между клиентом и сервером, которая не пропускает соединения webSocket через.
  3. Вы ' Мы подключили к одному и тому же веб-серверу несколько обработчиков сервера socket.io. Вы не можете сделать это, так как коммуникация будет действительно испорчена, поскольку несколько обработчиков сервера пытаются ответить одному и тому же клиенту.

В качестве теста вы можете заставить клиента соединяться только с webSocket ( вообще не нужно опрашивать) и посмотреть, не установится ли соединение:

let socket = io(yourURL, {transports: ["websocket"]})'
socket.on('connect', () => {console.log("connected"});
socket.on('connect_error', (e) => {console.log("connect error: ", e});
socket.on('connect_timeout', (e) => {console.log("connect timeout: ", e});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...