使用路由器在 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.aLogin
和 req.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
}
});
我正在使用 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.aLogin
和 req.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
}
});