У меня есть экспресс-приложение с socket.io, но когда я получаю около 70 одновременных подключений, сайт не отправляет ответ - PullRequest
0 голосов
/ 07 декабря 2018

После 70-80 подключений мой nodejs не отправляет ответ пользователю

app.use(passport.initialize());
app.use(passport.session());
socketIo.on('connection',async(socket) => {
    socket.handshake.session.save((err)=> {if(err)return err;});
    socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
    socket.on('disconnect', () => {
        socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
    })
    await UserController(<any>socket)
})
app.get('/', (req,res) => {
    res.sendFile(`${__dirname}/public/index.html`)
})

, а Usercontroller - это обещание, которое разрешается, когда пользователь отключается

1 Ответ

0 голосов
/ 08 декабря 2018

слушатель для разъединения создается всегда, когда устанавливается новое соединение.

socketIo.on('connection',async(socket) => {
    socket.handshake.session.save((err)=> {if(err)return err;});
    socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
    socket.on('disconnect', () => {  <--- Created everytime 'connection' event received
        socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
    })
    await UserController(<any>socket)
})

Слушатель должен быть создан вне другого слушателя:

socketIo.on('connection',async(socket) => {
   socket.handshake.session.save((err)=> {if(err)return err;});
   socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)        
   await UserController(<any>socket)
})
socket.on('disconnect', () => { 
   socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
})

Все это происходит асинхронноТаким образом, вы просто создаете 2 слушателя параллельно.С вашим кодом, если у вас есть 80 соединений, у вас также есть 80 слушателей разъединения.Это, я думаю, может вызвать некоторые проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...