2011-09-22 37 views
0

我想實現一個會話存儲爲express.js節點應用 我的問題是:節點,會話存儲中刪除過期會議

  1. 你如何刪除有一個瀏覽器會話cookie的生命週期(標有到期=根據虛假連接DOC)
  2. 我應該存儲會話數據作爲JSON字符串,或直接作爲對象

這是我想出了迄今爲止咖啡腳本,使用貓鼬因爲我是這樣的orm我選擇了應用

express = require 'express' 
    mongoose = require "mongoose" 
    util  = require "util" 

    # define session schema 
    SessionSchema = new mongoose.Schema 
     sid  : { type: String, required: true, unique: true } 
     data : { type: String, default: '{}' } 
     expires : { type: Date, index: true } 

    module.exports = 
    class SessionStore extends express.session.Store 
     constructor: (options) -> 

     console.log "creating new session store" 

     options ?= {} 

     # refresh interval 
     options.interval ?= 60000 

     options.url ?= "mongodb://localhost/session" 

     # create dedicated session connection 
     connection = mongoose.createConnection options.url 

     # create session model 
     @Session = connection.model 'Session', SessionSchema 

     # remove expired session every cycles 
     removeExpires = => @Session.remove expires: { '$lte': new Date() } 

     setInterval removeExpires, options.interval 

     get: (sid, fn) -> 
     @Session.findOne sid: sid, (err, session) -> 
      if session? 
      try 
       fn null, JSON.parse session.data 
      catch err 
       fn err 
      else 
       fn err, session 

     set: (sid, data, fn) -> 

     doc = 
      sid: sid 
      data: JSON.stringify data 
      expires: data.cookie.expires 
     try 
      @Session.update sid: sid, doc, upsert: true, fn 
     catch err 
      fn err 

     destroy: (sid, fn) -> 
     @Session.remove { sid: sid }, fn 

     all: (fn) -> 
     @Session.find { expires: { '$gte': new Date() } }, [ 'sid' ], (err, sessions) -> 
      if sessions? 
      fn null, (session.sid for session in sessions) 
      else 
      fn err 

     clear: (fn) -> @Session.drop fn 

     length: (fn) -> @Session.count {}, fn 
+0

你見過[connect-mongo](https://github.com/kcbanner/connect-mongo)嗎?它總是通過它的ID從數據庫中獲取會話數據,並在需要時銷燬它在客戶端('if!expires或Date.now()

回答

0

我對節點很新,所以帶上一粒鹽。

雖然不是直接面向會話導向的remember me tutorial on dailyjs會幫助我想一下。特別是他驗證登錄令牌的最後一段代碼。

此外,我認爲解析JSON並將其作爲對象存儲會更好。如果您事先處理好分析,應該更容易以這種方式訪問​​不同的cookie位。