我正在开发游戏。每个玩家都有一个会话,登录后我会保留他的名字。登录后,每个玩家都通过 websocket 连接。如何将播放器会话绑定到 websocket?我想确保每个玩家会话只能同时打开一个 websocket,如果他打开另一个(例如在新标签中)我关闭前一个。
let express = require('express'),
app = express(),
cookie = require('cookie'),
fs = require('fs'),
server = require('http').Server(app),
webSocket = require('ws'),
session = require('express-session');
let wss = new webSocket.Server({
verifyClient: (info, done) => {
sessionParser(info.req, {}, () => {
// there is no connect.sid when I place application on server, however on local it exists
done(info.req.session);
});
}, server
});
const sessionParser = session({
secret: '$eCuRiTy',
});
app.use(sessionParser);
server.listen(3000);
app.post('/signIn', async function(req, res) {
console.log(req.sessionID); // I want to get the sessionID in websocket
res.send(true);
});
wss.on('connection', async function(ws, req) {
console.log(req.sessionID); // I want to get sessionID from post req.sessionID
});
如果我在本地主机上运行应用程序,一切正常。来自 post 的 req.sessionID 与 websocket 中的 req.sessionID 相同。
但是,如果我将应用程序放在服务器上,会话会有所不同。在 verifyClient connect.sid 的 info 对象的标头中不存在。
我该如何解决?