node.js - 使用 Node 表达和套接字防止新选项卡中的新连接

标签 node.js sockets express

停止在 node express 和 socket 的不同选项卡中创建新连接

我正在开发一个聊天应用程序,它使用 node、express 和 socket 在端口 3000 上运行。

如果同一浏览器的其他选项卡访问相同的 url,我只想停止在客户端和服务器之间创建套接字连接。

有人可以帮我解决这个问题吗?我知道我必须使用 session 和 cookie,但我无法在 io.sockets.on('connection'); 中管理 session

提前致谢。

最佳答案

基于这篇文章。 answer by pr0zac

创建一个 express Session Store ,你可以使用 redis 或其他任何东西...... 我们稍后将使用 session cookie

//better to use redis store
MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();

app.configure(function () {
  app.use(express.session({ store: session_store }));
});

关于连接事件处理程序

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {

      if(session.lastConnected - Date.now() < HALF_HOUR) {
         socket_client.close()
      } else {
         session.lastConnected = Date.now()
      }
  });

  socket_client.on('disconnect', function () {
      if (connect_sid) {
        session_store.get(connect_sid, function (error, session) {
          // reset lastconnected
          session.lastConnected = 0;
        }
     });
  });
 }

});

我正在使用快速 session 对象来确定连接的时间戳增量是否小于半小时(可以修改)。 如果确实发生了,我会关闭套接字,否则我会将 lastConnected 更新到现在。

socket_client.on('disconnect', function() { ....

在断开连接事件上,我重置了套接字上的 session lastConnected 标志。

关于node.js - 使用 Node 表达和套接字防止新选项卡中的新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27417071/

相关文章:

javascript - 错误 : ENOENT, 没有这样的文件或目录 '/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript/app/models

javascript - 如何获取实时数据?

node.js - Nodejs fs 文件处理 : Getting error type in order to handle it more efficient

node.js - 附加到 Express 中的 url 路径

c - PF_PACKET-family socket 需要 root 权限,在 linux 上是如何配置的?

node.js - 如何在 Express 中使用 Jeet?

javascript - 如何通过 Electron 获取唯一的 PC ID?

sockets - 使用 SIOCGIFINDEX 获取接口(interface)索引时出错

c - select() 函数的第一个参数到底是什么

node.js - res.send 和 res.json 的区别