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

session handling in expressjs with router

我正在使用 expressJS,我对会话有点困惑。我有 1 个 expressJS 服务器,可以从不同的 URLs 访问。根据连接来自哪里(打开 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));
    });
});

您的 cookie 不一定与您的数据库相关联。您的所有路线共享一个 cookie 存储。 "Name" 指的是您的会话 cookie 的名称,这适用于您的所有路由(这就是为什么 express-session 是在 app.use 中调用的中间件)。一般来说,每个 Express 应用程序只有一个会话。如果您真的想将这些与多个会话存储区分开来,您将需要创建多个快速应用程序来处理您的路线。

在你的情况下,看起来你真的应该使用两个完全不同的路由器和两个完全独立的 URLS 集。您将有一些重复代码,但由于您要处理两个独立的数据库、两个不同的 "sessions" 和两个不同的 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
   }
});