2015-11-09 97 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