2015-11-09 98 views
0

我使用expressJS,我對會話有點困惑。我有一個單一的expressJS服務器,可以從不同的URL訪問。根據連接來自frmo(打開哪個URL)的位置,使用不同的數據庫來提供響應。我可以看到這些會話是相互衝突的。expressjs與路由器的會話處理

我的假設是我應該根據請求的URL設置不同的cookie名稱,但似乎我不能在會話配置中指定一個函數。

任何想法?

var app = express(); 
var session = require('express-session'); 

var router = express.Router(); 

app.use('/a_route', router); 
app.use('/b_route', router); 

router.use(session({ 
    genid: function(req) { 
    return require('crypto').randomBytes(48).toString('hex'); // use UUIDs for session IDs 
    }, 
    secret: 'JollynakAjollynakAjollynakApamPam', 
    resave: false, 
    saveUninitialized: false, 
    name: **THIS SHOULD BE DYNAMIC BASED ON URL???** 
})); 

編輯

//declare session variable 
var sess =""; 


router.post('/login', function (req, res, next) { 

    sess = req.session; 

    var uname = req.body.username; 
    var pwd = req.body.password; 
    var authResult = null; 

    sess.username = uname; 
    sess.instance = req.baseUrl.replace('/', ''); 
}) 

和示例AJAX調用

router.get('/getSomething', function (req, res) { 

    service.getCaps(sess.instance, function (response) { 
     res.send(JSON.stringify(response)); 
    }); 
}); 

回答

0

您的Cookie不一定依賴於你的數據庫。您的所有路線共享一個cookie存儲。 「名稱」是指會話cookie的名稱,這適用於所有路由(這就是爲什麼快速會話是在app.use中調用的中間件的原因)。一般而言,每個快速應用只能有一個會話。如果您真的想要將它們與多個會話存儲區分開來,您需要創建多個快速應用來處理您的路由。

在你的情況下,你應該真的使用兩個完全不同的路由器和兩個完全獨立的URLs集合。你會得到一些重複的代碼,但是由於你正在處理兩個單獨的數據庫,兩個不同的「會話」和兩個不同的URL,所以將它們分開是有意義的。然後,您可以爲每條路線設置唯一的會話變量(例如,req.session.aLoginreq.session.bLogin);

var routerA = express.Router(); 
var routerB = epxress.Router(); 

app.use('/a_route', routerA); 
app.use('/b_route', routerB); 

另一種方法是在您的路由中處理單獨的會話變量。

router.post('/login', function (req,res) { 
    req.session[req.baseUrl+'auth'] = true; 
}); 

router.get('/something', function (req,res) { 
    if (req.session[req.baseUrl+'auth'] { //User is authenticated for this particular database 
     //Rest of your code 
    } 
}); 
+0

我明白了,謝謝。你有建議如何得到一個解決方案,有一個「基礎」的網址,例如:東西:3000,然後是:3000/a_route,東西:3000/b_route。其中的關鍵是我抓住baseUrl,並在配置文件中查找它,並決定連接哪個數據庫。 – Ashton

+0

如果它們位於相同的基本URL上,它們可能應共享同一個Cookie存儲。你有什麼理由不能這樣做嗎? – Harangue

+0

不,你是對的,這個問題可能在別處。我發佈了更多我的代碼。基本上我有一個'sess'變量在所有內容之外聲明,並且在登錄過程中,在正確的數據庫中查找之後,我添加一個'instance'屬性。但是這會導致如果我使用ExampleUser1登錄到3000/a_route,然後將ExampleUser2設置爲3000/b_route,那麼ExampleUser1發出的下一個AJAX調用將發送到b_route – Ashton