使用路由器在expressjs中进行会话处理

时间:2015-11-09 19:21:35

标签: node.js express url-routing express-session

我使用expressJS,我对会话有点困惑。我有1个单独的expressJS服务器,可以从不同的URL访问。根据连接到达的位置(打开哪个URL),使用不同的数据库来提供响应。而且我可以看到这些会议存在冲突。

我的假设是我应该根据请求的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));
    });
});

1 个答案:

答案 0 :(得分:0)

您的Cookie不一定与您的数据库绑定。您的所有路线共享一个cookie商店。 “名称”是指会话cookie的名称,这适用于所有路由(这就是为什么快速会话是app.use中调用的中间件)。一般来说,每个快递应用只会有一个会话。如果您真的想要将它们与多个会话存储区分开来,您将需要创建多个快速应用程序来处理您的路线。

在您的情况下,看起来您应该使用两个完全不同的路由器和两个完全独立的URL。您将拥有一些重复的代码,但由于您正在处理两个不同的数据库,两个不同的“会话”和两个不同的URL,因此将它们分开是有意义的。然后,您可以为每条路线设置唯一的会话变量(例如req.session.aLoginreq.session.bLogin);

var routerA = express.Router();
var routerB = express.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
   }
});