将帐户分配给网络套接字连接

Assigning account to a web socket connection

我正在构建一个可以玩纸牌游戏的网站,我需要确保网络套接字连接来自用户。我正在使用 express-session、connect-mongo、express 和 ws 包,但在获取 session 时遇到问题。

升级时解析 session

server.on('upgrade', function (request, socket, head) {
  console.log('Parsing session from request...');

  session(request, {}, () => {

    console.log('Session is parsed!');

    wss.server.handleUpgrade(request, socket, head, function (ws) {
      wss.server.emit('connection', ws, request);
    });
  });
});

express-session

module.exports = session({
  secret: "HOPEFULLY-NO-ONE-FINDS-THIS!!!!",
  store: new MongoStore({ mongooseConnection: mongoose.db }),
  cookie: { secure: false }
})

正在创建 ws 服务器
var wss = new WebSocket.Server({ noServer: true });

保存到 session

router.post('/login', function(req, res, next) {
    const { username, password } = req.body;
    user.authUser(username, password, (err, user) =>{
        if (err) return res.send("Error on login!");
        req.session.user = user;
        res.redirect("/")
    });
});

在客户端,我使用简单的
new WebSocket('ws://localhost:3000');

连接到我的 ws 服务器

此代码几乎是从 here 复制而来的,但它对我不起作用。当我尝试像这样记录 session

wss.on('connection', function connection(ws, req) {
        console.log(req.session);
}

我只得到

Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: false
  }
}

我几乎被困在这里了。这甚至是正确的方法吗?提前致谢!

所以浏览器只会在域与当前网站相同时使用 websocket 握手发送 cookie。我虽然这对我来说不是问题,但事实证明 localhost 和 127.0.0.1 不是一回事。将 new WebSocket('ws://localhost:3000'); 变成 new WebSocket('ws://127.0.0.1:3000'); 可以解决问题。