节点快速连接 – 会话pipe理

我已经为ConnectJS的ArangoDB写了一个会话存储驱动程序。 这是工作,虽然仍然非常阿尔法,但我有几个问题。

具有“假”过期属性的第一次会话仅在用户代理期间保持不变。 我注意到,当浏览器窗口closures时,不会调用session.destroy()。 这导致在商店中留下“被遗弃”的会话。 我怎样才能有效地清除这些? 有没有办法按计划search和销毁废弃的会话?

其次,我已经实施了本会话商店的最低要求,如本页所述: http : //www.senchalabs.org/connect/session.html (接近底部)

那会得到,设置和摧毁。 另外两个build议的方法是长度和清晰。 这些方法究竟应该做什么? 我假设长度返回一个会话已经活跃的时间长度? “清除”与“销毁”有何不同? 谢谢!

除非你在客户端上安装了一些事件来通知服务器窗口正在closures,否则服务器将无法知道会话不再使用。

你想思考会议两部分。 一部分是在节点和浏览器之间传递的令牌(cookie)。 第二个是实际存储中的会话持久性(基本MemoryStore或Redis,或者您的新会话存储另一个数据库)。 所有的连接会话代码正在将这些与每个请求匹配起来。

  • 检查会话cookie
  • 如果存在,请尝试在商店中查找
  • 使来自商店的检索数据可用于请求
  • 在请求结束时,更新cookie的TTL信息
  • 将会话写回商店

请注意,除非您正在使用MemoryStore,否则Node上的会话数据不会在您的请求对其进行操作的情况下进行。 (好吧,这将是在内存中的一段时间,但将不被引用,并受垃圾收集)。 当您考虑各种部署scheme时,这是有道理的。

因此,服务器端会话到期的工作属于商店本身。 Redis之所以这么做的原因之一,是因为它可以自动pipe理即将到期的事情,您可以在set-operation中看到connect-redis

  RedisStore.prototype.set = function(sid, sess, fn){ sid = this.prefix + sid; try { var maxAge = sess.cookie.maxAge , ttl = this.ttl , sess = JSON.stringify(sess); ttl = ttl || ('number' == typeof maxAge ? maxAge / 1000 | 0 : oneDay); debug('SETEX "%s" ttl:%s %s', sid, ttl, sess); this.client.setex(sid, ttl, sess, function(err){ err || debug('SETEX complete'); fn && fn.apply(this, arguments); }); } catch (err) { fn && fn(err); } }; 

您可以看到,它将TTL除以1000,因为它使用秒而不是毫秒来过期。 最stream行的MongoDB会话存储以同样的方式使用MongoDB的TTLfunction。

所以说,要么依赖数据库引擎自动提供服务器端的会话过期,要么需要自己实现到期,这是很长的路要走。 你可以在你的节点应用程序(也许是另一个节点进程)之外有一个进程,或者你的商店实现可以安装一个SetInterval任务来定期检查和清理它。 举个例子,一个基于MySQL的会话存储就是这样做的

关于你的问题的第二部分,什么是lengthclear做法? 该评论是正确的,RedisStore没有实现这些,他们可能会被安全地忽略,但是你可以在MemoryStore源代码中看到他们的实现。 不太令人兴奋。

clear清空所有的会议和callback如果提供callback:

 MemoryStore.prototype.clear = function(fn){ this.sessions = {}; fn && fn(); }; 

length只需在商店中的会话数量callback:

 MemoryStore.prototype.length = function(fn){ fn(null, Object.keys(this.sessions).length); }; 

希望这是有帮助的。