событие разъединения socket.io перед соединением - PullRequest
0 голосов
/ 19 февраля 2020

Я создаю приложение чата с использованием 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;

}

когда я отправляю форму, консоль сразу регистрирует отключение пользователя и сразу после этого в чате появляется сообщение о подключении. Как предотвратить появление этого события до того, как пользователь подключится?

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