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



我在 localhost:8000 上为我的应用程序运行 webpack-dev-server,在端口 3000 上运行 express+socket.io 为我的 api 运行。我已经代理了在 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'));

我让它工作的唯一方法是先做一个 AJAX 请求来localhost:3000

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);
});

GitHub Gist

最新更新