我正在try 使用插座.IO在 node 中.js,我试图让服务器 for each 套接字提供一个标识.IO客户端.由于套接字代码不在http服务器代码的范围内,因此无法轻松访问发送的请求信息,因此我假设需要在连接期间发送.最好的方法是什么

1) 向服务器获取有关谁正在通过套接字连接的信息.木卫一

2) 验证他们说自己是谁(我目前正在使用Express,如果这能让事情变得更容易的话)

推荐答案

使用connect redis并将redis用作所有经过身份验证的用户的会话存储.确保在身份验证时向客户端发送密钥(通常是req.sessionID).让客户端将此密钥存储在cookie中.

在socket connect(或以后任何时候)上,从cookie中获取此密钥并将其发送回服务器.使用此键在redis中获取会话信息.(拿到 keys )

如:

服务器端(以redis作为会话存储):

req.session.regenerate...
res.send({rediskey: req.sessionID});

客户端:

//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx

//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();

socket.on('connect', function() {
  var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
  socket.send({rediskey: rediskey});
});

服务器端:

//in io.on('connection')
io.on('connection', function(client) {
  client.on('message', function(message) {

    if(message.rediskey) {
      //fetch session info from redis
      redisclient.get(message.rediskey, function(e, c) {
        client.user_logged_in = c.username;
      });
    }

  });
});

Node.js相关问答推荐

MongoServelSelection错误:服务器 Select 在30000 ms后超时

如何使用多个OR参数从多个集合聚合

Firebase-admin筛选器.或只考虑第一个WHERE子句

类扩展值[object object]不是构造函数或null

PM2 是否需要成为其托管项目的依赖项?

Express Web 服务器部署到 prod 但 GET 返回超时错误

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

npm install 在 Mac 上的 Node-gyp 构建错误

如何更改NodeJS中的堆栈大小限制?

使用 grunt 服务器,如何将所有请求重定向到根 url?

Node JS:自动 Select `http.get`与`https.get`

使 pm2 登录到控制台

Passport 登录和持久会话

已安装全局 NPM 包但未找到命令

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

Bootstrap 中的 Grunt 依赖冲突

Node.js 与 .net 中的异步/等待

如何在express 中设置默认路径(路由前缀)?

webpack-dev-server 找不到模块webpack

deno vs ts-node:有什么区别