Javascript 如何使socket.io只连接一次

Javascript 如何使socket.io只连接一次,javascript,express,websocket,socket.io,Javascript,Express,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)

当我转到另一个屏幕或更新页面时,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”创建另一个连接时,由于浏览器的工作方式,当它离开一个网页并加载一个新网页时,原始网页中的所有资源都会被处理掉。这包括webSocket或socket.io连接。因此,在浏览器选项卡/窗口中用不同的网页替换网页a时,无法从网页a保持socket.io连接打开。没有办法做到这一点

通常的解决方法是在新网页中建立一个新的socket.io连接,并让服务器使用某种状态(通常是cookie)来知道它是哪个用户,这样它就可以重新为该用户执行它需要执行的任何操作,就像相同的socket.io连接正在继续一样

其他解决方法是使用框架,其中一个框架在浏览器中不被替换,因此它可以保持一个连续的socket.io连接;或者使用单页应用程序体系结构,其中浏览器页面在用户导航时不被替换