#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), чтобы знать, какой это пользователь, чтобы он мог просто повторно подключить все, что ему нужно сделать для этого пользователя, как если бы тот же сокет.подключение ввода-вывода продолжалось.
Другие обходные пути заключаются в использовании фреймов, когда один фрейм не заменяется в браузере, чтобы он мог содержать непрерывный сокет.подключение ввода-вывода или использовать одностраничную архитектуру приложения, в которой страница браузера не заменяется при перемещении пользователя.