Я создаю приложение чата с использованием socket.io и node.js В моем index.e js У меня есть форма для получения данных от пользователя, а затем я перенаправляю его на страницу чата. На странице чата у меня есть код клиента, который запускает соединение с сервером. Проблема случается в разъединении. Когда я перенаправляю из index.e js в чат, происходит событие. Я хочу, чтобы сервер прослушивал его сразу после фактического установления соединения.
server. js
const path = require('path');
const express = require('express');
const layout = require('express-layout');
const app = express();
var server = require('http').createServer(app);
var io=require('socket.io')(server);
const routes = require('./router')(app);
const bodyParser = require('body-parser');
var fs = require("fs");
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
const middleware = [
layout(),
express.static(path.join(__dirname, 'public')),
bodyParser.urlencoded(),
];
app.use(middleware);
app.use('/', routes);
app.use((req, res, next) => {
res.status(404).send("Sorry can't find that!");
});
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
//IO
io.on('connection', onConnect);
function onConnect(socket) {
var contents = fs.readFileSync("./public/rooms.json");
let rooms = JSON.parse(contents);
socket.emit('parse',rooms);
app.locals.socket=socket;
socket.on('join',function (room,username) {
socket.join(room);
socket.room=room;
io.sockets.in(room).emit('joined',username);
io.sockets.in(room).emit('server-message',username + " just joined us, say hello");
});
socket.on('message',function (message,room,user) {
socket.to(room).emit('message',message,user);
})
socket.on('typing',function (user,room) {
socket.to(room).emit('typing',user);
})
socket.on('stopped-typing',function (user,room) {
socket.in(room).emit('stopped-typing',user);
})
socket.on('disconnect', function(){
/*// remove the username from global usernames list
delete usernames[socket.username];
// update list of users in chat, client-side
io.sockets.emit('updateusers', usernames);
// echo globally that this client has left
socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');*/
socket.leave(socket.room);
console.log('user disconnected from chat');
});
}
server.listen(3000, () => {
console.log(`App running at http://localhost:3000`);
});
chat. js
var socket=io.connect();
let chat = document.getElementById('chat-area');
let online = document.getElementById('online');
let typing = document.getElementById('typing')
let typingList = new Array();
let onlineList = new Array();
var lastnode = chat;
var typingTimer; //timer identifier
var doneTypingInterval = 5000;
socket.emit('join', room, user);
socket.on('joined', function (user) {
onlineList.push(user);
showOnline();
})
socket.on('server-message', function (message) {
let node = document.createElement('div');
node.setAttribute('class', 'messageC');
node.innerHTML = message;
chat.appendChild(node);
})
$('#message').submit(function (e) {
e.preventDefault();
socket.emit('message', $('#text').val(), room, user);
let node = document.createElement('div');
node.setAttribute('class', 'messageR');
let title = document.createElement('h3');
title.setAttribute('class', 'user');
title.innerHTML = 'you';
let content = document.createElement('p');
content.setAttribute('class', 'content');
content.innerHTML = $('#text').val();
node.append(title);
node.append(content);
chat.append(node);
socket.emit('stopped-typing', user, room);
return false;
});
socket.on('message', function (message, user) {
let node = document.createElement('div');
node.setAttribute('class', 'messageL');
let title = document.createElement('h3');
title.setAttribute('class', 'user');
title.innerHTML = user;
let content = document.createElement('p');
content.setAttribute('class', 'content');
content.innerHTML = message;
node.append(title);
node.append(content);
chat.append(node);
})
$('#text').on('change', function () {
socket.emit('typing', user, room);
clearTimeout(typingTimer);
typingTimer = setTimeout(doneTyping, doneTypingInterval);
});
$('#text').on('keydown', function () {
clearTimeout(typingTimer);
});
socket.on('typing', function (user) {
typingList.push(user);
showTypingL();
})
socket.on('stopped-typing', function (user) {
let index = typingList.indexOf(user);
if (index > -1) {
typingList.splice(index, 1);
}
showTypingL();
})
function showTypingL() {
typing.innerHTML = "typing: ";
for (var key in typingList) {
typing.innerHTML += typingList[key] + ", ";
}
}
socket.on('disconnect', function () {
socket.emit('leave');
});
function doneTyping() {
socket.emit('stopped-typing', user, room);
}
function showOnline() {
let count = 0;
for (var key in onlineList) {
count++;
}
online.innerHTML = 'online: ' + count;
}
когда я отправляю форму, консоль сразу регистрирует отключение пользователя и сразу после этого в чате появляется сообщение о подключении. Как предотвратить появление этого события до того, как пользователь подключится?