当前位置: 首页 > 知识库问答 >
问题:

session.id 更改和 socket.io 不匹配

汪永春
2023-03-14

我正在本地主机:8000上运行webpack-dev-server为我的应用程序运行,并为我的api在端口3000上运行快速 socket.io。我已经在 webpack.config 中代理了 socket.io 的请求.js如下所示:

devServer: {
    proxy: {
        '/socket.io': {
            target: 'http://localhost:3000',
            ws: true
        }
    }
}

然而,不仅express和socket.io中的会话id不匹配,express中的会话id也会改变每个请求:

服务器:

let app = require('express')();
let session = require('express-session')({
    secret: 'panopticon',
    resave: true,
    saveUninitialized: true
});
let server = require('http').createServer(app);
let io = require('socket.io')(server);

//session middleware
app.use(session);
io.use(require('express-socket.io-session')(session, {
    autoSave: true
}));

let i=0;

app.get('/socket.io', (req, res) => {
    console.log(i++, req.session.id);
    //0 'ShgnU91kCZzC7xHP9B57ZtsCbwi3XjdB'
    //1 'qLsYYpRZXpyoUrcKzF6K7uoAIKtE9oCh'

    res.send();
});

io.on('connection', socket => {
    console.log(socket.handshake.session.id);
    //MRUYZMVstMh6ssNrq9LP-Z4vTaT5SZcs
});

客户:

//connect to socket
let socket = io();
//make two requests to /socket.io
fetch('socket.io').then(() => fetch('socket.io'));

共有1个答案

商开济
2023-03-14

我实现这一点的唯一方法是首先向localhost:3000执行AJAX请求:

fetch('http://127.0.0.1:3000', {
    credentials: 'include'
});

在响应上使用以下处理程序:

app.use('/', (req, res) => {
    res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8080');
    res.header('Access-Control-Allow-Credentials', 'true');
    res.sendStatus(200);
});

吉特哈布

 类似资料:
  • 问题内容: 我在具有基本HTTP服务器(没有Express或Connect或类似的东西)的Node服务器上使用Socket.IO。默认情况下,Socket.IO将客户端文件提供给 /socket.io/socket.io.js 我希望能够将该基本路径更改为其他内容,例如 /foo/bar/socket.io/socket.io.js 是否有任何内置方法来执行此操作,或者是否有任何不更改Socket

  • 我最近开始学习node.js和socket.io。我遵循了socket.io的一个简单教程,它在我的电脑上运行时一切正常。然而,我决定将客户端上传到服务器进行测试,这就是问题的开始。我想在web主机上运行聊天客户端,在我的计算机或其他主机上运行服务器。基本上,我计划对服务器进行端口转发,并让客户机在网页上运行。我打开我的端口到端口转发,它似乎是工作的,但是我每次都在网页上得到错误。 我一直在弄乱代

  • 我正在使用CloudFlare实现一个REST API。我需要添加一些在node.js上用socket.io实现的通知。当socket.io使用活动连接来保持客户机更新时,它将工作,因为连接是在服务器-客户机之间建立的,但是当socket.io进行轮询时会发生什么呢?CloudFlare是否总是为每个客户机使用相同的服务器?

  • 所以我有一个使用 socket.io 和 expressjs 的 nodejs 应用程序 我使用端口“3000”作为Express应用程序,使用端口“8080”作为套接字应用程序 > 这两种服务是否可以使用相同的端口?(express和socket.io) 当我想从客户端连接到套接字时,我使用以下代码: http://localhost:8080套接字 什么是连接到它的正确方式(我在互联网上的教程

  • 他们在两边配置了相同的keystore和truststore文件。我已经打开了它们的keystore和truststore,这是它们的构建方式: keystore entry1-server cert[1]md5:x cert[2]md5:y cert[3]md5:Z TrustStore entry1-root 证书[1]MD5:Z entry2-intermedium 证书[1]MD5:Y 在

  • 问题内容: 我已经习惯了MSSQL,而不是Mysql,所以对这个可能很愚蠢的问题感到抱歉。我正在尝试通过运行以下查询来更新备份数据库的密码: 当我运行它时,它说 查询正常,受影响的0行(0.01秒)匹配的行:1已更改:0警告:0 为什么行匹配但没有变化? 问题答案: 这意味着该值未更改。由于该列已等于的md5哈希值,因此可能未更改。