Как создать сокет.io подключается только один раз

#javascript #express #websocket #socket.io

#javascript #экспресс #websocket #socket.io

Вопрос:

Когда я перехожу на другой экран или обновляю страницу, новое соединение выдается на socket.io . Я бы хотел, чтобы, когда пользователь заходит на первую страницу, подключался только один раз и продолжал с тем же подключением на других экранах

 
const express = require('express');
const path = require('path');

const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);


app.use(express.static(path.join(__dirname, 'public')));
app.set('views', path.join(__dirname, 'public'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');


app.get('/', (req, res) => {
    res.render('home.html');
});

app.get('/chat', (req, res) => {
    res.render('salachat.html');
});

app.get('/novoproduto', (req, res) => {
    res.render('novoproduto.html');
});

let messages = [];

let produtos = [];

io.on('connection', socket =>{
    console.log(`novo usuario conectado : ${socket.id}`);
    socket.emit('previousMessages', messages );
    socket.emit('previousprodutos', produtos );


    socket.on('sendMessage', data => {
        messages.push(data);
        socket.broadcast.emit('receivedMessage', data);
    });

    socket.on('sendProduto', data => {
        produtos.push(data);
        socket.broadcast.emit('receivedProdutos', data);
    });

});

server.listen(3000);


  

Когда я ввожу маршрут «/», создается новое соединение, когда я ввожу «/ chat» или «/ novoproduto», создается другое

Ответ №1:

Из-за того, как работает браузер, когда он покидает веб-страницу и загружает новую страницу, ВСЕ ресурсы с исходной веб-страницы удаляются. Это включает в себя WebSocket или socket.соединения ввода-вывода. Таким образом, вы не можете сохранить сокет.подключение ввода-вывода открывается со страницы A, когда вы заменяете страницу A другой веб-страницей на вкладке / окне браузера. Это невозможно сделать.

Обычный обходной путь — просто установить новый сокет.подключение ввода-вывода на новой веб-странице и чтобы сервер использовал какое-то состояние (часто файл cookie), чтобы знать, какой это пользователь, чтобы он мог просто повторно подключить все, что ему нужно сделать для этого пользователя, как если бы тот же сокет.подключение ввода-вывода продолжалось.

Другие обходные пути заключаются в использовании фреймов, когда один фрейм не заменяется в браузере, чтобы он мог содержать непрерывный сокет.подключение ввода-вывода или использовать одностраничную архитектуру приложения, в которой страница браузера не заменяется при перемещении пользователя.