Я создаю приложение чата стека MEAN. И я хочу иметь возможность получить идентификатор экспресс-сеанса внутри socket.io в обработчике соединения. Я могу получить доступ к socket.handshake.session.id, но это не то же самое, что req.session.id. Далее socket.handshake.session.id продолжает меняться для каждого сокета.
Я попытался решить эту проблему, получив идентификатор сеанса из req.handshake.cookie, выполнив поиск ключа connect.sid, но этот ключ там не определен.
const cors = require('cors'),
express = require('express'),
eSession = require('express-session'),
cookieParser = require('cookie-parser'),
MongoStore = require('connect-mongo')(eSession),
sharedsession = require('express-socket.io-session'),
http = require('http'),
bodyParser = require('body-parser'),
socketio = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketio(server);
const port = process.env.PORT || 3000;
//imports
const mongoose = require('./config/dbconnection');
//routes
const user = require('./api/routes/user');
const socketHandle = (io, mStore) => {
io.on('connection', (socket) => {
socket.on('join', (options, callback) => {
console.log(socket.handshake.headers.cookie); //no connect.sid string present
console.log(socket.handshake.session.id) // has value but keeps changing on each io connection and this id is not the same as req.session.id in an api endpoint method
});
});
const corsOptions = {
origin: 'http://localhost:4200',
optionsSuccessStatus: 200
};
const db = mongoose.connection;
const mStore = new MongoStore({ mongooseConnection: db });
const session = eSession({
secret: 'my-secret',
resave: true,
saveUninitialized: true,
store: mStore
});
app.use(cookieParser('my-secret'));
app.use(session);
io.use(sharedsession(session,{autoSave:true}));
socketHandle(io, mStore);
//body-parser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors(corsOptions));
app.use('/user', user);
server.listen(port, () => console.log(`listening on http://localhost:${port}`));
И socket.handshake.session.id, и socket.handshake.headers.cookie(connect.sid key) должны были предоставить идентификатор сеанса, который имеет то же значение, что и req.session.id.